我有一个带有多个同时显示按钮的小部件的Qt应用程序。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我覆盖了主小部件中的keyPressEvent() (它拥有此应用程序中的所有子小部件),如果子小部件没有焦点,则使用类似下面的代码重新发送按键事件:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}只要someWidget处理所说的事件,这就很有效。如果它忽略它,那么它会进入一个令人讨厌的无限递归循环,因为事件会向上流到父级。
有没有办法知道事件是从哪里来的,这样我就可以防止这种无限循环了?我在想这样的事情:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}或者,有没有其他方法可以防止这种情况发生?
发布于 2014-09-23 03:16:17
当您使用信号和槽机制时,您可以调用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,所以如果你确定是QEvent的话就转换成event->type() == QEvent::KeyPress。例如:
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
//do something
}https://stackoverflow.com/questions/25981262
复制相似问题