2011-07-11 28 views
10

我需要這樣做來配置我的應用程序。 我有重新實現keyPressEvent方法的QLineEdit字段。如何根據當前鍵盤佈局從QKeyEvent捕獲QKeySequence?

QKeyEvent *ke = ... 
QString txt; 

if(ke->modifiers() & Qt::ControlModifier) 
    txt += "Ctrl+"; 
if(ke->modifiers() & Qt::AltModifier) 
    txt += "Alt+"; 
if(ke->modifiers() & Qt::ShiftModifier) 
    txt += "Shift+"; 

if(ke->key() >= Qt::Key_0 && ke->key() <= Qt::Key_9) 
    txt += ('0' + ke->key() - Qt::Key_0); 
else if(ke->key() >= Qt::Key_A && ke->key() <= Qt::Key_Z) 
    txt += ('A' + ke->key() - Qt::Key_A); 
ui->hotkeyEdit->setText(txt); 

但是這種解決方案只能用英文字符創建快捷方式。例如,當我使用俄語鍵盤佈局時,此代碼將顯示相同的序列,但使用英文字符放置在同一個鍵盤鍵上。

回答

17

你可能會發現非常有用的是函數QKeySequance()。toString()。

以下是我用來限制用戶定義的快捷方式的代碼的一部分。通過一些修改,它可以做你想要的任何項目。希望它可以幫助(對遺漏的身份抱歉):

if (event->type() == QEvent::KeyPress){ 
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 

    int keyInt = keyEvent->key(); 
    Qt::Key key = static_cast<Qt::Key>(keyInt); 
    if(key == Qt::Key_unknown){ 
     qDebug() << "Unknown key from a macro probably"; 
     return; 
    } 
    // the user have clicked just and only the special keys Ctrl, Shift, Alt, Meta. 
    if(key == Qt::Key_Control || 
     key == Qt::Key_Shift || 
     key == Qt::Key_Alt || 
     key == Qt::Key_Meta) 
    { 
     qDebug() << "Single click of special key: Ctrl, Shift, Alt or Meta"; 
     qDebug() << "New KeySequence:" << QKeySequence(keyInt).toString(QKeySequence::NativeText); 
     return; 
    } 

    // check for a combination of user clicks 
    Qt::KeyboardModifiers modifiers = keyEvent->modifiers(); 
    QString keyText = keyEvent->text(); 
    // if the keyText is empty than it's a special key like F1, F5, ... 
    qDebug() << "Pressed Key:" << keyText; 

    QList<Qt::Key> modifiersList; 
    if(modifiers & Qt::ShiftModifier) 
     keyInt += Qt::SHIFT; 
    if(modifiers & Qt::ControlModifier) 
     keyInt += Qt::CTRL; 
    if(modifiers & Qt::AltModifier) 
     keyInt += Qt::ALT; 
    if(modifiers & Qt::MetaModifier) 
     keyInt += Qt::META; 

    qDebug() << "New KeySequence:" << QKeySequence(keyInt).toString(QKeySequence::NativeText); 
} 
2

優選standard seqence

Keyboard Layout Issues

其結果是,人類可讀的字符串和硬編碼的密鑰代碼既可以是有問題的指定可以在各種不同的鍵盤中使用的鍵序列時使用佈局。只有使用標準快捷鍵才能保證用戶能夠使用開發人員預期的快捷方式。

+0

我想用戶可以設置自己的快捷鍵操作。 –

3

您可以將鍵盤快捷鍵分配給操作。

這裏有一些做法。

actionName->setShortcut(QKeySequence::New); //for predefined shortcuts like new, close, open.. 

,或者你可以用這個

actionName->setShortcut(QKeySequence("Ctrl+N")); // sets Ctrl + N for w.e the action does 

定義自己的快捷方式。在第一種情況下qt的自動檢測,並指定針對該特殊操作相應的快捷方式。在第二種情況下,您可以選擇自己想要的快捷方式並將其輸入爲字符串。它會自動解析並理解。

這樣可以避免爲了不必要的目的而使用密鑰捕獲。

5

如果有人關心上面的Tihomir Dolapchiev解決方案的Python版本。我剛翻譯過它,效果很好。只是張貼以備將來參考。

class KeySequenceEdit(QtGui.QLineEdit): 
    """ 
    This class is mainly inspired by 
    http://stackoverflow.com/a/6665017 

    """ 

    def __init__(self, keySequence, *args): 
     super(KeySequenceEdit, self).__init__(*args) 

     self.keySequence = keySequence 
     self.setKeySequence(keySequence) 

    def setKeySequence(self, keySequence): 
     self.keySequence = keySequence 
     self.setText(self.keySequence.toString(QtGui.QKeySequence.NativeText)) 


    def keyPressEvent(self, e): 
     if e.type() == QtCore.QEvent.KeyPress: 
      key = e.key() 

      if key == QtCore.Qt.Key_unknown: 
       warnings.warn("Unknown key from a macro probably") 
       return 

      # the user have clicked just and only the special keys Ctrl, Shift, Alt, Meta. 
      if(key == QtCore.Qt.Key_Control or 
      key == QtCore.Qt.Key_Shift or 
      key == QtCore.Qt.Key_Alt or 
      key == QtCore.Qt.Key_Meta): 
       print("Single click of special key: Ctrl, Shift, Alt or Meta") 
       print("New KeySequence:", QtGui.QKeySequence(key).toString(QtGui.QKeySequence.NativeText)) 
       return 

      # check for a combination of user clicks 
      modifiers = e.modifiers() 
      keyText = e.text() 
      # if the keyText is empty than it's a special key like F1, F5, ... 
      print("Pressed Key:", keyText) 

      if modifiers & QtCore.Qt.ShiftModifier: 
       key += QtCore.Qt.SHIFT 
      if modifiers & QtCore.Qt.ControlModifier: 
       key += QtCore.Qt.CTRL 
      if modifiers & QtCore.Qt.AltModifier: 
       key += QtCore.Qt.ALT 
      if modifiers & QtCore.Qt.MetaModifier: 
       key += QtCore.Qt.META 

      print("New KeySequence:", QtGui.QKeySequence(key).toString(QtGui.QKeySequence.NativeText)) 

      self.setKeySequence(QtGui.QKeySequence(key)) 
2

simpliest方法是:

if(event->type() == QEvent::KeyPress) 
{ 
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); 
    qDebug() << "delete" << keyEvent->matches(QKeySequence::Delete); 
    qDebug() << "copy" << keyEvent->matches(QKeySequence::Copy); 
    qDebug() << "paste" << keyEvent->matches(QKeySequence::Paste); 
}