Получить " имя " ключа от QKeyEvent в Qt

есть ли простой способ получить имя ключа (так что что-то вроде "uparrow" из ключевого события вместо того, чтобы просто получить код ключа "16777235")? Мне самому составить список ключевых имен?

2 ответов


использование удобочитаемых имен в коде

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

С документация QKeyEvent:

int QKeyEvent:: key () const

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

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

...

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

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

QString QKeyEvent:: text () const

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

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

отображение удобочитаемых имен для пользователя

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

самый простой способ получить удобочитаемые названия клавиш показать использовать QKeySequence:: toString ().

вот пример:

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

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


другой подход использует систему Qt metaobject и интроспекцию в большинстве перечислений в пространстве имен 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());
}