Получить & quot; имя & quot; ключа из QKeyEvent в Qt

Есть ли простой способ получить имя ключа (например, «вверх» из ключевого события вместо простого получения кода ключа «16777235»)? Должен ли я сам составить список ключевых имен?

10

Решение

Вы можете использовать Qt :: Key enum или получить ключ в виде строки с QKeyEvent :: текст ().

От Документация QKeyEvent:

int QKeyEvent :: key () const

Возвращает код клавиши, которая была нажата или отпущена.

Смотрите Qt :: Key для списка кодов клавиатуры. Эти коды не зависят от базовой оконной системы. Обратите внимание, что эта функция не различает заглавные и заглавные буквы, для этой цели используйте функцию text () (возвращающую текст Unicode, сгенерированный ключ).

Qt :: Key перечисление, которое отображает идентификаторы числовых ключей (например, возвращаемое значение QKeyEvent :: key ()) в программист считываемые имена как Qt::Key_Up,

Если вы заботитесь только о буквенно-цифровых клавишах, вы также можете использовать QKeyEvent :: текст () чтобы получить значение:

QString QKeyEvent :: text () const

Возвращает текст Unicode, сгенерированный этим ключом. Возвращаемый текст может быть пустой строкой в ​​случаях, когда нажимаются или отпускаются клавиши-модификаторы, такие как Shift, Control, Alt и Meta. В таких случаях key () будет содержать допустимое значение.

Смотрите также Qt :: WA_KeyCompression.

использование QKeySequence :: ToString () или создайте свою собственную таблицу «хороших» имен.

Самый простой способ получить понятные человеку ключевые имена показать пользователю это использовать QKeySequence :: ToString ().

Вот пример:

Qt::Key key = Qt::Key_Up;
qDebug() << QKeySequence(key).toString(); // prints "Up"

Если вам не нравятся имена, которые использует QKeySequence (например, вы хотите использовать «Стрелку вверх» вместо «Вверх»), вам нужно будет составить таблицу данных, чтобы переназначить значения перечисления на ваши предпочтительные имена.

11

Другие решения

Другой подход использует систему метаобъектов Qt и самоанализ в большинстве перечислений в пространстве имен Qt. Это работает как в Qt 4, так и в Qt 5.

// https://github.com/KubaO/stackoverflown/tree/master/questions/keyname-21764138
#include <QMetaEnum>

namespace SO {
enum KeyNameOption { KeyNameNone = 0, AppendArrow = 1 };
Q_DECLARE_FLAGS(KeyNameOptions, KeyNameOption)
}
QString keyName(int index, SO::KeyNameOptions opt = {}) {
constexpr static auto const getEnum = [](const char *name) {
int enumIndex = qt_getQtMetaObject()->indexOfEnumerator(name);
return qt_getQtMetaObject()->enumerator(enumIndex);
};
static const auto keyEnum = getEnum("Key");
static const auto modifierEnum = getEnum("KeyboardModifiers");

auto name = modifierEnum.valueToKeys(index & Qt::KeyboardModifierMask);
index &= ~Qt::KeyboardModifierMask;

if (name == "NoModifier")
name.clear();
else {
name.replace('|', '+');
name.replace("Modifier", "");
name.append('+');
}

auto keyName = keyEnum.valueToKey(index);
if (keyName)
name.append(keyName + 4);
if ((opt & SO::AppendArrow) && index >= Qt::Key_Left && index <= Qt::Key_Down)
name.append(" Arrow");
return QLatin1String(name);
}

int main() {
Q_ASSERT(keyName(Qt::Key_Tab) == "Tab");
Q_ASSERT(keyName(Qt::ShiftModifier | Qt::Key_Up, SO::AppendArrow) == "Shift+Up Arrow");
Q_ASSERT(keyName(Qt::AltModifier | Qt::Key_Down) == "Alt+Down");
}

Затем вы будете использовать его, скажем, keyPressEvent, следующее:

void MyWidget::keyPressEvent(QKeyEvent * ev) {
qDebug() << keyName(ev->key());
}
6

По вопросам рекламы [email protected]