我有一个Qt
应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件中重写了keyPressEvent()
(拥有此应用程序中的所有子窗口小部件),并且如果它没有使用类似于此的代码的焦点,则将关键事件重新发送到子窗口小部件:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}
只要someWidget
handes说事件,这就行得很好。如果它忽略了它,那么它会进入一个讨厌的无限递归循环,因为事件会流向父母。
有没有办法知道事件的来源,所以我可以阻止这种无限循环?我在考虑这样的事情:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}
或者我有什么不同的方法可以防止这种情况发生?
答案 0 :(得分: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
}