c++ - 确定 QKeyEvent 的来源

标签 c++ linux qt qt5.2

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

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

只要 someWidget 处理上述事件,它就可以很好地工作。如果它忽略它,那么它会进入一个讨厌的无限递归循环,因为事件会向上流动到父级。

有没有办法知道事件的来源,从而防止这种无限循环?我在想这样的事情:

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

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

最佳答案

当你使用信号和槽机制时,你可以调用可以给你信息的sender(),但是你可以做下一步:使用可以给你信息的eventFilter关于每个将事件发送到 mainWindowQObject,因此您可以捕获事件和发送者

    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,所以如果你确定event->type() == QEvent::KeyPress 就转换QEvent。例如:

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

关于c++ - 确定 QKeyEvent 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25981262/

相关文章:

c++ - 类 'Entity' 中类 'Component' 的指针变量,即使包含 'Entity.h' 也会出错

c++ - 在 STL vector 中存储对象 - 最少的方法集

python - 如何使用 Pygame 设置 Xbox One Controller 触发器的范围?

c - 编译某些函数所需的库

c++ - 添加空间隔 Widget 导致 Qt 中的内存泄漏?

qt - 如何在 QFileDialog::getExistingDirectory 中指定文件过滤器?

c++ - 是否会调用析构函数,如果是,那么由于哪个 vector ?

C++生成随机数

linux - 如何获取Linux中特定进程的CPU利用率

c++ - 从 QNetworkReply 读取未解码的数据