如何阻止回车键关闭我的QDialog(Qt 4.8.1)

cpp*_*guy 13 c++ qt qdialog qpushbutton

我有QDialog一个QDialogButtonBox." 确定"和" 取消"按钮处于活动状 有时我会根据对话框的状态禁用或隐藏"确定"按钮.看来,无论我做什么,Enter键总是激活OK按钮.我真的不希望这种情况发生.我试过了:

  • 每次显示/隐藏/启用/禁用/无论按钮时,都将default和autoDefault属性设置为false
  • 在OK按钮上安装事件过滤器,以拦截返回,输入和空格的键事件(按下和释放)
  • 将按钮上的焦点策略设置为NoFocus

并且通过上述所有组合,Enter键仍然接受对话框.有没有人知道如何阻止这个?看起来我应该能够阻止这么简单的事情吗?

ale*_*sdm 13

按键事件过滤应该在对话框本身上完成,因为处理将Return和Enter键转发到默认按钮的代码在QDialog::keyPressEvent.

void Dialog::keyPressEvent(QKeyEvent *evt)
{
    if(evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return)
        return;
    QDialog::keyPressEvent(evt);
}
Run Code Online (Sandbox Code Playgroud)

要么

theDialog?>installEventFilter(anotherClassObject);

bool AnotherClass::eventFilter(QObject *obj, QEvent *evt)
{
    if(evt->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(evt);
        if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return )
            return true; // mark the event as handled
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 你不应该忽略()事件,但接受它并什么都不做.但是如果仍然启用了取消按钮,并且可以获得焦点,则仍可以通过Enter键激活它并关闭对话框. (2认同)

Pet*_*ete 7

如果对话框上有普通的 QPushButtons,那么如果按钮设置了 autoDefault 和/或默认属性,那么您将获得一个默认按钮 - 这是 Enter 键触发的。在这种情况下,删除按钮上的 autoDefault 并在另一个小部件中按 Enter 键将不再关闭对话框。

对于 QDialogBu​​ttonBox,您可能可以迭代按钮以在对话框的构造函数中关闭此功能。此处未测试,但应该可以工作。如果没有,那么您还需要查看 QDialog 本身是否也设置了默认按钮。