2014-02-13 117 views
9

有没有一种简单的方法来获取密钥的名称(比如从关键事件中的“uparrow”,而不是获取密钥代码“16777235”)?我必须自己制作关键字名单吗?从QKeyEvent获取密钥的名称Qt

+0

为什么不干脆让枚举代表的核心价值观? –

回答

10

在你的代码

使用人类可读的名称可以使用Qt::Key枚举,或拿到钥匙与QKeyEvent::text()字符串。

QKeyEvent documentation

INT QKeyEvent ::键()const的

返回按下或释放的键的代码。

请参阅Qt :: Key获取键盘代码列表。这些代码独立于底层窗口系统。请注意,该函数不区分大小写字母,为此使用text()函数(返回生成密钥的Unicode文本)。

...

Qt::Key是映射数字键ID的枚举(如QKeyEvent的返回值::键()),以程序员可读名称,如Qt::Key_Up

如果你只关心字母数字键,也可以使用QKeyEvent::text()来获取值:

的QString QKeyEvent ::文本()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使用的名称(例如,你想使用“向上箭头”,而不是“向上”),你需要让你的数据表将枚举值重新映射到您的首选名称。

+0

谢谢,QKeySequence :: toString正是我所需要的。 – Ben

6

另一种更通用的方法是利用Qt元对象系统和内省对Qt命名空间中的大多数枚举进行反省。这适用于Qt 4和Qt 5。

#include <QMetaEnum> 

class KeyHelper : private QObject { 
public: 
    static QString keyName(int index) { 
     static int keyEnumIndex = staticQtMetaObject.indexOfEnumerator("Key"); 
     QString name = staticQtMetaObject.enumerator(keyEnumIndex).valueToKey(index); 
     if (index >= Qt::Key_Left && index <= Qt::Key_Down) name += " Arrow"; 
     return name.isEmpty() ? QString() : name.mid(4); 
    } 
}; 

int main() 
{ 
    Q_ASSERT(KeyHelper::keyName(Qt::Key_Tab) == "Tab"); 
    Q_ASSERT(KeyHelper::keyName(Qt::Key_Up) == "Up Arrow"); 
} 

,那么你会用它,也就是说,keyPressEvent如下:

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

这正是我所需要的 – Jared