不调用focusOutEvent

时间:2013-07-30 11:59:58

标签: c++ qt

我将#include <QFocusEvent>添加到我的代码中并按如下方式实施focusOutEvent

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

}

窗口小部件描述符具有以下额外行:

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

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

virtual void focusOutEvent(QFocusEvent * event);

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

3 个答案:

答案 0 :(得分:3)

对我来说,诀窍是强调关注对话框。 即:

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测试的

答案 1 :(得分:2)

可能没有被调用,因为它与QWidget中的声明不匹配

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

你也试着打电话给setMouseTracking(true)(文件说这里没有必要,但这可能会有所帮助)并且调用原始事件处理程序是好的 你能指定你正在运行的操作系统吗?

答案 2 :(得分:0)

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

如果是这样的话,那么MyWidget在父母聚焦时就会始终处于焦点(我猜)。

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

或者你可以把它变成顶级小部件(没有父级)。