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