繁体   English   中英

确定QKeyEvent的来源

[英]Determine source of QKeyEvent

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

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

只要someWidget处理上述事件,此方法someWidget好用。 如果它忽略它,那么它将进入一个讨厌的无限递归循环,因为事件将流向父级。

有没有办法知道事件从哪里来,所以我可以防止这个无限循环? 我在想这样的事情:

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

还是有其他方法可以防止这种情况的发生?

当使用信号和插槽机制时,可以调用sender() ,它可以为您提供信息,但是在这里您可以下一步:使用eventFilter可以为您提供有关将事件发送到mainWindow每个QObject信息,因此您可以捕获事件和发送者

    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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM