如何禁用 Qt Mainwindow 快捷方式适用于无模式对话框

Posted

技术标签:

【中文标题】如何禁用 Qt Mainwindow 快捷方式适用于无模式对话框【英文标题】:How to disable Qt Mainwindow shortcut applies to the modeless dialog 【发布时间】:2016-02-29 06:33:18 【问题描述】:

我创建了一个无模式的 Qt 对话框,其中包含一些单选按钮以及其他控件。对话框的父主窗口为左右箭头键启用了快捷方式。

现在我打开对话框并使用 tab 键移动到单选按钮,并尝试使用左右箭头键更改选定的单选按钮。不幸的是,现在左右箭头键被传递给父窗口并执行快捷操作,而不是更改对话框中的单选按钮。这对我来说真的是一个恼人的行为。

如何避免这种行为?是否可以在对话框中阻止父级的快捷方式。我更喜欢只能在对话框代码而不是主窗口代码中应用的解决方案。 谢谢。

【问题讨论】:

【参考方案1】:

我认为您的问题与事件过滤有关。你应该检查一下

http://doc.qt.io/qt-5/eventsandfilters.html

你可以覆盖这个函数并做一些事情。这当然是一个例子:

bool yourDialog::eventFilter(QObject *o, QEvent *e)

        if (event->type() == QEvent::KeyPress)
        
          QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
          if (keyEvent->key() == Qt::Key_Left)
          
             //do some stuff
             return true;

          
          else if(keyEvent->key() == Qt::Key_Right)
          
            //do some stuff
            return true;
          
        
         return false;

【讨论】:

其实这个我已经试过了。问题是我在事件过滤器中没有得到QEvent::ShortcutOverride 左/右箭头键。 这个怎么样: if (event->type() == QEvent::KeyPress) QKeyEvent* keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Up) // 做一些事情 else if(keyEvent->key() == Qt::Key_Down) // 做一些事情 不,即使这样也行不通。实际上,当箭头键传递给父级时,我没有得到任何 QEvent::ShortcutOverride、QEvent::Shortcut 或 QEvent::KeyPress !!! 你使用了 installEventFilter(this);对话框类或 yourDialogClass->installEventFilter(this) 的构造函数中的函数; ? 在我的对话框的 ctor 中,我为每个单选按钮安装了事件过滤器,例如 rb1-&gt;installEventFilter(this); rb2-&gt;installEventFilter(this) 等。

以上是关于如何禁用 Qt Mainwindow 快捷方式适用于无模式对话框的主要内容,如果未能解决你的问题,请参考以下文章

QT Creator中[main]和[mainwindow]的区别

QT:禁用退出mac应用程序的键盘快捷键或识别只允许closebutton事件退出应用程序

关于如何使用指向 MainWindow 的指针的 QT 问题

如何避免 Qt 快捷方式歧义(尤其是当快捷方式有不同的上下文时)?

如何在 Flutter Web 中禁用默认浏览器快捷方式?

如何使用 Qt 在 MainWindow 中显示 QForm?