Qt工具提示在显示时将窗口置于前面

Qt tooltip brings window to front when it is being shown

本文关键字:于前面 前面 窗口 工具提示 显示 Qt      更新时间:2023-10-16

[Windows 7上的Qt 5.4.2] 在同一个Qt应用程序中创建两个窗口(QDialog或QMainWindow)。它们中的每一个都有一个关联的工具提示。定位窗口 d2 部分重叠的窗口 d1。将鼠标悬停在d2窗口上,将弹出工具提示"d2窗口"。问题是鼠标悬停在 d1 窗口上不仅会显示工具提示"d1 窗口",还会将窗口 d1 移动到前面。走到前面不是想要的行为。此外,单击 d2 窗口工作区不会将 d2 移动到前台。 显示工具提示时如何不让窗口出现?我已经设置了WA_AlwaysShowToolTips和WA_ShowWithoutActivating旗帜。

*当只有一个qt窗口时,这个问题似乎不会发生,但我的设计需要多个窗口。

QDialog * d1=new QDialog();
d1->setToolTip("d1 window");
d1->setAttribute(Qt::WA_AlwaysShowToolTips);
d1->setAttribute(Qt::WA_ShowWithoutActivating);
d1->show();
QDialog * d2=new QDialog();
d2->setToolTip("d2 window");
d2->setAttribute(Qt::WA_AlwaysShowToolTips);
d2->setAttribute(Qt::WA_ShowWithoutActivating);
d2->show();

使用 spy++ 会显示在显示工具提示时发送WM_WINDOWPOSCHANGING窗口消息:WM_WINDOWPOSCHANGING LPWP:0E14C740WM_WINDOWPOSCHANGING LPWP:0E14C740WM_WINDOWPOSCHANGING lpwp:0E14CA08

此错误最初出现在Qt 5.0中,在Qt 5.3.0(QTBUG-39147)中报告,并在5.9.2(2017年7月19日)中修复。删除 Qt_WS_* 宏(替换为 Q_OS_* 宏)和不完整的 widgets/kerna/qtooltip.cpp 模块维护,导致 QTipLabel 以客户端小部件作为其父小部件进行实例化。这是Windows上的一个已知问题,直接导致了这种功能障碍(显示工具提示会提高整个窗口)。

请参阅此Qt代码审查页面中的"补丁集6",以及它相关的"gitweb"链接,以及原始错误报告:

  • https://codereview.qt-project.org/#/c/177376/
  • https://bugreports.qt.io/browse/QTBUG-39147