Получить " имя " ключа от QKeyEvent в Qt
есть ли простой способ получить имя ключа (так что что-то вроде "uparrow" из ключевого события вместо того, чтобы просто получить код ключа "16777235")? Мне самому составить список ключевых имен?
2 ответов
использование удобочитаемых имен в коде
можно использовать Qt:: Key перечисление, или получить ключ в виде строки с QKeyEvent:: text ().
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());
}