1

我有一个安装了事件过滤器的 QMainWindow,它打开了一个 QDialog。主窗口处理 Enter 键的按键释放。但是,当我在 QDialog 打开并处于焦点时按 Enter 键时,主窗口也会捕获此事件。

我怎样才能防止这种情况发生?我试图在 QDialog 中安装一个事件过滤器,以重新实现 keyReleaseEvent 和 keyPressEvent 函数,更改父级(当前为 0),但似乎没有任何帮助......

请注意,当我更改 QMainWindow 的事件过滤器以便它处理按键而不是按键释放时,QDialog 工作正常,但随后我得到了我试图避免的其他错误......

bool Window::eventFilter(QObject *, QEvent *event) {
 if (type == QEvent::KeyRelease) {
   QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

   switch(keyEvent->key()) {
   case Qt::Key_Enter:
     // do something here
     break;
   default:
     break;
   }
}

Dialog::Dialog(unsigned int num, QWidget *parent)
: QDialog(parent), num(_num)
{
   ui.setupUi(this);
   ui.btnOK->setEnabled(false);

   connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(accept()));
   connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(reject()));

   installEventFilter(this);
}

bool Dialog::eventFilter(QObject *, QEvent *event) {
 return true;
} 

提前致谢

4

1 回答 1

2

尝试 webclectic 的第一种方法,但替换e->ignore()e->accept(), 因为ignore()的行为与您想要实现的相反。

void MyDialog::keyReleaseEvent(QKeyEvent* e)
{
    QDialog::keyReleaseEvent(e);
    if (e->key() == Qt::Key_Enter)
        e->accept();
}

或者也许你应该尝试模态对话框?

更新:如果我们希望对话框响应 Enter 键释放,我们必须始终调用 QDialog 的实现。

于 2012-04-23T12:12:37.073 回答