focusOutEvent is not called

focusOutEvent is not called

本文关键字:called not is focusOutEvent      更新时间:2023-10-16

我在代码中包含了#include <QFocusEvent>,并实现了focusOutEvent,如下所示:

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

Widget描述符有以下额外的行:

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

我对头文件也有如下定义:

virtual void focusOutEvent(QFocusEvent * event);

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

对我来说,诀窍是把焦点集中在对话框上。即:

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

最初我有一个dialog->activateWindow(),它应该同样地设置对话框的焦点,但setFocus()似乎能更好地完成任务。

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

注意:这是在Fedora 25(KDE Spin)上用Qt 5.7.1 测试的

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

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

此外,您也不能尝试调用setMouseTracking(true)(documentaion说不需要,但这可能会有所帮助),最好调用原始事件处理程序
你能指定你正在运行的操作系统吗?

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

如果是这样的话,那么MyWidget在其父级处于焦点时总是处于焦点(我想)。

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

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