【问题标题】:How to make a Qt dialog to deal with key event instead of all its child widget?如何制作一个 Qt 对话框来处理关键事件而不是其所有子小部件?
【发布时间】:2012-07-18 11:31:30
【问题描述】:

我有一个对话框继承QDialog。该对话框有许多小部件,包括Qbuttons、QLabel、QGraphicsView等。许多小部件如按钮可以在获得焦点时处理SPACE按键事件。现在我不希望任何子小部件处理它,而是让主对话框来处理。由于主对话框中有很多小部件,所以我没有为它们安装EventFilter,而是为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 调整大小或重绘事件未处理?谁能告诉我如何在主对话框中捕捉关键事件,但不影响其他功能?

【问题讨论】:

    标签: qt keypress qt4.7 qkeyevent


    【解决方案1】:

    基本上,如果您在 Qt 中开发基于对话框的 App,默认情况下,按键事件由主对话框类捕获,前提是您在主类中定义了 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);
        }
    }
    

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

    【讨论】:

    • 如果一个小部件(例如按钮)获得焦点,然后按下一个键,焦点小部件的 keyPress 事件将被调用,并且不会处理其父级。我认为也许 qApp 将事件分派到正确的目的地(焦点小部件)。
    • 感谢您的回复。 OverWrite children 小部件的事件处理方法或安装事件过滤器都可以。但是在主对话框中,有很多小部件,所以会写很多代码,结构不好。我想我应该处理所有事件都准备好调度的关键事件。
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多