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

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

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

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

【问题讨论】:

    标签: c++ qt


    【解决方案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) 等。
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多