我有一个对话框继承QDialog。该对话框有许多小部件,包括Qbuttons、QLabel、QGraphicsView等。许多小部件如按钮可以在获得焦点时处理SPACE按键事件。现在我不希望任何子小部件处理它,而是让主对话框来处理。由于主对话框中有很多小部件,所以我没有为它们安装事件过滤器,而是为 qApp 安装。
代码如下:
QApplication app(argc, 0);
MyDialog *pDlg = new MyDialog(...);
qApp->installEventFilter(pDlg);
app.exec();
和主对话框的事件过滤器:
bool MyDialog::eventFilter(QObject *obj, QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->key == Qt::Key_Space && !ke->isAutoRepeat())
{
// do my things in the main dialog
return true;
}
}
return qApp->eventFilter(watched, event);
}
不幸的是,使用这段代码后,主对话框的布局很奇怪,似乎有些小部件不记得他们的大小政策。也许一些 Qt 调整大小或重绘事件未处理?谁能告诉我如何在主对话框中捕捉关键事件,但不影响其他功能?