首页 文章

QMainWindow正在处理应由QDialog捕获的事件

提问于
浏览
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;
}

提前致谢

1 回答

  • 2

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

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

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

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

相关问题