2014-09-22 81 views
0

我有一个Qt应用程序与多个小工具同时显示按钮。在某些情况下,我想要将按键发送到其中一个小部件,即使该小部件没有焦点。要做到这一点,我在主部件覆盖keyPressEvent()(即拥有这个应用程序的所有subwidgets)和关键事件重新发送到SubWidget的,如果它不使用类似于此代码具有焦点:确定QKeyEvent的来源

if (!someWidget->hasFocus()) 
{ 
    QApplication::sendEvent(someWidget, keyEvent); 
} 

这个作品很好,只要someWidget handes说的事件。如果它忽略它,那么它会进入一个令人讨厌的无限递归循环,因为事件流向父母。

有没有办法知道事件来自哪里,所以我可以防止这个无限循环?我在想这样的事情:

if (!someWidget->hasFocus() && (keyEvent->source != someWidget)) 
{ 
    QApplication::sendEvent(someWidget, keyEvent); 
} 

或者是否有不同的方法可以防止这种情况发生?

+0

'QApplication :: focusWidget'? Imho,QKeyEvent的来源是用户平台API。 – 2014-09-22 20:44:02

回答

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,如果你确信投下。例如:

QKeyEvent *key = static_cast<QKeyEvent*>(event); 
if(key->key() == Qt::Key_0) 
{ 
    //do something 
} 
+0

它看起来像在eventFilter(QObject * obj,QEvent *事件)中,'obj'是观看的对象,而不是发送事件的对象。你知道是否有办法确定事件源? – KyleL 2014-09-23 00:07:01

+0

@KyleL情况如何?你选择什么时候做这个或这是用户操作?也许你可以用信号插槽做这件事,并使用发件人() – Chernobyl 2014-09-23 04:33:26

+0

@KyleL和你想做什么?赶上按下并设置文本到其他文本编辑或什么? – Chernobyl 2014-09-23 04:40:15