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