[英]Determine source of QKeyEvent
我有一个Qt
应用程序,其中有多个小部件同时显示按钮。 在某些情况下,我希望将按键发送给其中一个小部件,即使该小部件没有焦点也是如此。 为此,我在主窗口小部件(拥有此应用程序中的所有子小部件keyPressEvent()
中覆盖了keyPressEvent()
,如果没有使用以下类似代码将焦点事件重新发送给子小部件,则将其重新发送到子小部件:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}
只要someWidget
处理上述事件,此方法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
,投下QEvent
,如果你确信event->type() == QEvent::KeyPress
。 例如:
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
//do something
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.