0

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

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

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

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

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

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

4

1 回答 1

1

当您使用信号和插槽机制时,您可以调用sender()which 可以为您提供信息,但接下来您可以执行以下操作:使用eventFilterwhich 可以为您提供有关每个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投吧。例如:QEventevent->type() == QEvent::KeyPress

QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
    //do something
}
于 2014-09-22T19:16:16.637 回答