у меня есть Qt
приложение с несколькими виджетами, показывающими кнопки одновременно. В определенных обстоятельствах я хочу, чтобы нажатия клавиш отправлялись на один из виджетов, даже если этот виджет не имеет фокуса. Для этого я переопределил keyPressEvent()
в главном виджете (который владеет всеми подвиджетами в этом приложении) и повторно отправьте событие ключа в подвиджет, если он не имеет фокуса, используя код, подобный следующему:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}
Это прекрасно работает, пока someWidget
Хандес сказал событие. Если он игнорирует его, то он входит в неприятный бесконечный рекурсивный цикл, поскольку события передаются родителям.
Есть ли способ узнать, откуда произошло событие, чтобы я мог предотвратить этот бесконечный цикл? Я думаю о чем-то вроде этого:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}
Или есть другой способ, которым я могу предотвратить это?
Когда вы используете механизм сигналов и слотов, вы можете позвонить 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
}