4

我包含#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);

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

4

3 回答 3

4

对我来说,诀窍是将注意力集中在对话上。IE:

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 Spin) 上测试的

于 2017-01-29T08:30:10.023 回答
3

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

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

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

于 2013-07-31T13:40:25.537 回答
0

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

如果是这样,那么MyWidget当它的父母处于焦点时,它总是处于焦点(我猜)。

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

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

于 2017-01-23T08:11:16.850 回答