C++ 未调用focusOutEvent

C++ 未调用focusOutEvent,c++,qt,C++,Qt,我将#include包含到我的代码中,并实现了focusOutEvent,如下所示: void MyWidget::focusOutEvent(QFocusEvent *e) { if(e->type() == QEvent::FocusOut) { fprintf(stderr, "hello"); } } virtual void focusOutEvent(QFocusEvent * event); 小部件描述符具有以下额外行: installE

我将
#include
包含到我的代码中,并实现了
focusOutEvent
,如下所示:

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

}
virtual void focusOutEvent(QFocusEvent * event);
小部件描述符具有以下额外行:

  installEventFilter(this);
  setFocusPolicy(Qt::WheelFocus);
我对头文件也有如下定义:

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

}
virtual void focusOutEvent(QFocusEvent * event);

问题是,无论我做什么(选项卡或单击其他地方),都没有将此事件称为焦点事件。如何解决此问题?

可能是因为它与QWidget中的declarion不匹配而未调用它

virtual **protected** void QWidget::focusOutEvent ( QFocusEvent * event ) 
此外,您不能尝试调用
setMouseTracking(true)
(文档中说不需要,但这可能会有所帮助),最好调用原始事件处理程序

您可以指定您正在运行的操作系统吗?

检查
MyWidget
是否以modal方式显示(modal:您无法与父窗口小部件交互)

如果是这样,那么当其父控件处于焦点时,
MyWidget
始终处于焦点(我猜)

您可以做的是不以模式显示它(调用
show()
而不是
exec()


或者您可以将其设置为顶级小部件(无父级)。

我的窍门是将焦点强制放在对话框上。 i、 e:

最初我有一个
dialog->activateWindow()
,它应该将焦点设置为对话框,但
setFocus()
似乎可以更好地完成任务

然后,当我单击对话框外的任何位置时,调用了我重新实现的
focusOutEvent()


注意:这是在Fedora 25(KDE Spin)上用Qt 5.7.1测试的
installEventFilter(此)。通常不需要为同一对象添加事件筛选器对象。如果在
eventFilter
方法实现(如果有)中过滤事件,也可能是故障的原因。已删除
installEventFilter
,但没有更改。我会尝试让您知道。我正在使用openSuse