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

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

只要handes说这个事件就行。如果忽略它,那么它将进入一个讨厌的无限递归循环,因为事件会流向父级。
有没有办法知道一个事件是从哪里来的,这样我就可以阻止这个无限循环?我在想这样的事情:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
    QApplication::sendEvent(someWidget, keyEvent);
}

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

最佳答案

当您使用信号和插槽机制时,您可以调用sender()来提供信息,但在这里您可以执行下一步:使用eventFilter来提供有关每个QObject的信息,这些mainWindow将事件发送到QKeyEvent,以便您可以捕获事件和发送者

    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);

也许你需要使用QEvent,所以如果你确定event->type() == QEvent::KeyPress,就使用cast。例如:
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
    //do something
}

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

10-15 16:39