2013-07-18 110 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