【问题标题】:C++ Qt QShortcut with numpad keyC++ Qt QShortcut 与数字键盘键
【发布时间】:2013-07-18 08:47:37
【问题描述】:

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

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

(提示:对于数字键,可以使用 QSignalMapper 将 QShortcut 的 activated() 信号映射到带有 int 参数的 Slot。

但是,在此示例中,使用 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”键。

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

【问题讨论】:

  • 您的解决方案似乎是最好的。我大部分时间都重新实现 keyPressEvent()/keyReleaseEvent() 并在那里过滤。
  • 最快的方法——为另一个对象安装一个事件过滤器。事件过滤器在目标对象之前处理事件,允许它根据需要检查和丢弃事件

标签: c++ qt keyboard-shortcuts


【解决方案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

【讨论】:

    【解决方案2】:

    为此,您可以使用keyReleaseEvent(QKeyEvent *event) 例如

    void Form::keyReleaseEvent(QKeyEvent *event)    {
        int key = event->nativeScanCode();
    
        if( key == 79 ) //value for numpad 7
        {
           //your statement   
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多