我有一个 Qt
应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件(拥有此应用程序中的所有子窗口小部件)中重写了 keyPressEvent()
,如果它没有焦点,则使用类似的代码将键事件重新发送到子窗口小部件对此:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}
只要 someWidget
处理上述事件,它就可以很好地工作。如果它忽略它,那么它会进入一个讨厌的无限递归循环,因为事件会向上流动到父级。
有没有办法知道事件的来源,从而防止这种无限循环?我在想这样的事情:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}
或者是否有其他方法可以防止这种情况发生?
最佳答案
当你使用信号和槽机制时,你可以调用可以给你信息的sender()
,但是你可以做下一步:使用可以给你信息的eventFilter
关于每个将事件发送到 mainWindow
的 QObject
,因此您可以捕获事件和发送者
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
,所以如果你确定event->type() == QEvent::KeyPress
就转换QEvent
。例如:
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
//do something
}
关于c++ - 确定 QKeyEvent 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25981262/