2013-07-30 36 views
3

我包括#include <QFocusEvent>到我的代码和实施focusOutEvent如下:focusOutEvent不叫

void MyWidget::focusOutEvent(QFocusEvent *e) 
{ 
    if(e->type() == QEvent::FocusOut) 
    { 
    fprintf(stderr, "hello"); 
    } 

} 

微件描述符具有以下额外的线路:

installEventFilter(this); 
    setFocusPolicy(Qt::WheelFocus); 

我也有头文件定义如下:

virtual void focusOutEvent(QFocusEvent * event); 

问题是,无论我做什么(标签或者在其他地方点击)不会调用这个焦点事件。我该如何解决这个问题?

+0

'installEventFilter(本);'应被删除。通常不需要为同一对象添加事件过滤器对象。如果事件在'eventFilter'方法实现中被过滤(如果有的话),它也可能是麻烦的原因。 –

+0

删除了'installEventFilter',但没有更改。 – www

回答

2

可能是它不叫,因为它没有匹配的QWidget到declarion

virtual **protected** void QWidget::focusOutEvent (QFocusEvent * event) 

还你不能尝试调用setMouseTracking(true)(文件建立说,在这个没有必要,但可能这可以帮助)和可以调用原始事件处理程序
可以指定你正在运行的操作系统吗?

+0

我会尽力让你知道。我正在使用openSuse – www

0

检查是否MyWidget显示在模式方式(模态:你不能与父窗口部件交互)。

如果是这样,那么MyWidget总是在焦点时,其父母对焦(我猜)。

你可以做什么不模式方式(拨打show()而不是exec()

显示它或者你可以把它的顶层窗口小部件(无父)。

3

对我来说,诀窍是为了强调对话的焦点。 即:

QDialog *dialog = new QDialog(); 
... 
dialog->show(); 
dialog->raise();  // to make sure it's shown on top 
dialog->setFocus(); 

我原本认为是应该将焦点设置对话框一样的一个dialog->activateWindow(),但setFocus()似乎得到更好地完成工作。

然后我重新实现的focusOutEvent()当我点击对话框外的任何地方时被调用。

注:这是使用Qt 5.7.1在Fedora 25(KDE自旋)测试