首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定QKeyEvent的来源

确定QKeyEvent的来源
EN

Stack Overflow用户
提问于 2014-09-23 02:57:44
回答 1查看 984关注 0票数 0

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

代码语言:javascript
复制
if (!someWidget->hasFocus())
{
    QApplication::sendEvent(someWidget, keyEvent);
}

只要someWidget处理所说的事件,这就很有效。如果它忽略它,那么它会进入一个令人讨厌的无限递归循环,因为事件会向上流到父级。

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

代码语言:javascript
复制
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
    QApplication::sendEvent(someWidget, keyEvent);
}

或者,有没有其他方法可以防止这种情况发生?

EN

回答 1

Stack Overflow用户

发布于 2014-09-23 03:16:17

当您使用信号和槽机制时,您可以调用sender()来提供信息,但是在这里您可以执行下一步操作:使用eventFilter,它可以为您提供每个向mainWindow发送事件的QObject的信息,这样您就可以捕获事件和发送者

代码语言:javascript
复制
    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);
}

别忘了

代码语言:javascript
复制
protected:
     bool eventFilter(QObject *obj, QEvent *event);

也许你需要使用QKeyEvent,所以如果你确定是QEvent的话就转换成event->type() == QEvent::KeyPress。例如:

代码语言:javascript
复制
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
    //do something
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25981262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档