2014-02-13 160 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