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

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

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

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

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

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

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

0

Решение

Когда вы используете механизм сигналов и слотов, вы можете позвонить 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
}
1

Другие решения


По вопросам рекламы [email protected]