2013-07-18 142 views
4

QShortcut可以很容易地一個QShortcutEvent(鍵按壓,組合或序列)連接到一個時隙的方法,例如:C++的Qt QShortcut與數字鍵盤鍵

QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_7), this, 0, 0, Qt::ApplicationShortcut); 

(提示:對於數字鍵,一個QSignalMapper可以是用於將QShortcut的activated()信號映射到具有int參數的插槽)。

但是,在本例中,如果啓用NumLock(numpad),則'7'鍵將觸發快捷方式的activated()信號。

有沒有一種方法來檢測除了過濾或重新實現小部件的keyPressEvent和檢查QKeyEvent::modifiers()Qt::KeypadModifier以外的其他鍵?

進一步挖掘,我發現

QTBUG-20191 Qt::KeypadModifier does not work with setShortcut鏈接到patch that has been merged into 4.8 in Sept. 2012並附帶使用

button2->setShortcut(Qt::Key_5 + Qt::KeypadModifier); 

不爲我的Qt的4.8.1 QShortcut工作test case,即,既不的「 7'鍵被識別使用(添加)修飾符標誌。

所以我想最快的方法是安裝一個過濾器來檢測修飾符,並讓所有其他keyEvents處理默認實現可用於QShortcut?

+0

您的解決方案似乎是最好的。我大部分時間重新實現keyPressEvent()/ keyReleaseEvent(),並在那裏過濾。 –

+0

最快的方法 - 是爲另一個對象安裝一個事件過濾器。事件過濾器可以在目標對象執行之前處理事件,從而允許它根據需要檢查和放棄事件 –

回答

1

爲此,您可以使用keyReleaseEvent(QKeyEvent *事件) 例如

void Form::keyReleaseEvent(QKeyEvent *event) { 
    int key = event->nativeScanCode(); 

    if(key == 79) //value for numpad 7 
    { 
     //your statement 
    } 


} 
0

您可以使用Qt.KeypadModifier,例如[Python中]:

def keyPressEvent(self, event): 
    numpad_mod = int(event.modifiers()) & QtCore.Qt.KeypadModifier 
    if event.key() == QtCore.Qt.Key5 and numpad_mod: 
     #Numpad 5 clicked