如何让Qt对话框处理关键事件而不是其所有的子部件?

我有一个对话框继承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调整大小或重绘事件没有处理? 任何人都可以告诉我如何捕捉主对话框中的关键事件,但不影响其他功能?


基本上,如果您在Qt中开发基于对话框的应用程序,默认情况下按键事件由主对话框类捕获,前提是您在主类中定义了keypressevent。

编辑使用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);
    }
}

同样,您也可以处理其他类型的按键事件。

链接地址: http://www.djcxy.com/p/39275.html

上一篇: How to make a Qt dialog to deal with key event instead of all its child widget?

下一篇: Connecting QDialog to QMainWindow