Определить источник QKeyEvent

У меня есть Qt приложение с несколькими виджетами, показывающими кнопки одновременно. В определенных обстоятельствах я хочу, чтобы нажатия клавиш отправлялись одному из виджетов, даже если этот виджет не имеет фокуса. Для этого я переопределил keyPressEvent() в главном виджете (который владеет всеми подвиджетами в этом приложении) и повторно отправьте событие ключа в подвиджет, если он не имеет фокуса, используя код, подобный следующему:

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

Это прекрасно работает, пока someWidget Хандес сказал событие. Если он игнорирует его, то он входит в неприятный бесконечный рекурсивный цикл, поскольку события передаются родителям.

Есть ли способ узнать, откуда произошло событие, чтобы я мог предотвратить этот бесконечный цикл? Я думаю о чем-то вроде этого:

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

Или есть другой способ, которым я могу предотвратить это?

1 ответ

Когда вы используете механизм сигналов и слотов, вы можете позвонить sender() который может дать вам информацию, но здесь вы можете сделать следующее: использовать eventFilter который может дать вам информацию о каждом 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так что снимали QEvent если ты уверен что event->type() == QEvent::KeyPress, Например:

QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
    //do something
}
Другие вопросы по тегам