C ++ Qt QShortcut with numpad key

时间:2013-07-18 08:47:38

标签: c++ qt keyboard-shortcuts

QShortcut可以轻松地将QShortcutEvent(按键,组合或序列)连接到插槽方法,例如:

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并附带test case使用

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

对Qt 4.8.1上的QShortcut不起作用,即使用(添加)修饰符标志都不能识别'7'键。

所以我想最快的方法是安装一个过滤器来检测修饰符,并让默认实现处理所有其他keyEvent以便可以使用QShortcut吗?

2 个答案:

答案 0 :(得分:2)

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

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

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


}

答案 1 :(得分:1)

您可以使用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