我有一个对话框继承了QDialog。该对话框有许多小部件,包括Qbuttons,QLabel,QGraphicsView等。许多小部件如按钮可以在获得焦点时处理SPACE按键事件。现在我不想要任何子小部件来处理它,但让主对话框执行。由于主对话框中有许多小部件,所以我没有为它们设置intallEventFilter,而是针对qApp。
代码如下:QApplication app(argc, 0);
MyDialog *pDlg = new MyDialog(...);
qApp->installEventFilter(pDlg);
app.exec();
主对话框的eventfilter:
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调整大小或重新绘制未处理的事件?任何人都可以告诉我如何在主对话框中捕捉关键事件,但不影响其他功能吗?
答案 0 :(得分:0)
基本上如果你在Qt中开发一个基于对话框的App,默认情况下,主要对话框类会捕获按键事件,前提是你在主类中定义了keypressevent。
EDIT
为此目的使用postevent()
在您的子窗口小部件按键事件中
void childwdgt::keyPressEvent(QKeyEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
{
QKeyEvent* newEvent = new QKeyEvent(QEvent::KeyPress,e->key(), e->modifiers ());
qApp->postEvent (yourParentWdgt, newEvent, 0);
}
}
同样,您也可以处理其他类型的关键事件。