我将#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);
问题是,无论我做什么(制表符或点击其他地方)都没有调用此焦点事件。我该如何解决这个问题?
答案 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()
)
或者你可以把它变成顶级小部件(没有父级)。