c++ - QMainWindow 正在处理应该被 QDialog 捕获的事件

标签 c++ qt

我有一个 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;
} 

提前致谢

最佳答案

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

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

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

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

关于c++ - QMainWindow 正在处理应该被 QDialog 捕获的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279500/

相关文章:

c++ - 如何对段进行排序 C++

c++ - 如何为具有共享指针的结构的多索引制作修饰符以 boost 记录器后端以重置此后端?

c++ - Qt 如何知道何时连接了新的 USB 存储设备?

c - Qt Creator 中的 Gstreamer rtsp 服务器链接

c++ - 在内存中为多个文件保存构造的静态数组c++

c++ - 仅在 Release模式下使用 glGenBuffer 的未处理异常 - QT

c++ - 在 QPolygon 中查找完全包含的正方形?

c++ - 如何在 C++ 中获取中继器的委托(delegate)数据?

c++ - 递归创建 boost 属性树

qt - Qt Creator 中的 MAKEFLAGS 通过 .pro 项目文件