确定QKeyEvent的来源

时间:2014-09-22 18:57:44

标签: c++ linux qt qt5.2

我有一个Qt应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件中重写了keyPressEvent()(拥有此应用程序中的所有子窗口小部件),并且如果它没有使用类似于此的代码的焦点,则将关键事件重新发送到子窗口小部件:

if (!someWidget->hasFocus())
{
    QApplication::sendEvent(someWidget, keyEvent);
}

只要someWidget handes说事件,这就行得很好。如果它忽略了它,那么它会进入一个讨厌的无限递归循环,因为事件会流向父母。

有没有办法知道事件的来源,所以我可以阻止这种无限循环?我在考虑这样的事情:

if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
    QApplication::sendEvent(someWidget, keyEvent);
}

或者我有什么不同的方法可以防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

当您使用信号和插槽机制时,您可以拨打sender()来提供信息,但是您可以在此处执行操作:使用eventFilter可以为您提供有关每个QObject的信息将事件发送到mainWindow,以便您可以捕获事件和发件人

    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
    if(event->type() == QEvent::KeyPress)//your keyPressEvent but with eventFilter
        if(!someWidget->hasFocus() && obj != someWidget)//your focus and source checkings, obj is object which send some event,
                                                        // but eventFilter catch it and you can do something with this info
        {   
        //do something, post event
        }

return QObject::eventFilter(obj, event);
}

别忘了

protected:
     bool eventFilter(QObject *obj, QEvent *event);

也许您需要使用QKeyEvent,如果您确定QEvent,请投射event->type() == QEvent::KeyPress。例如:

QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
    //do something
}