Qt工具提示在显示时将窗口置于前面
Qt tooltip brings window to front when it is being shown
[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
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 移除前面有空格的前2个字符串
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 字符数组前面的加号是什么意思?
- 在单链表前面添加一个节点后,我无法遍历每个节点
- ::(范围解析运算符)前面没有任何东西
- 列表C++移动到前面;
- 在每个可变参数宏参数前面加上 C++ 函数参数的名称
- 为什么在函数参数前面添加 const 会出错?
- 增强循环缓冲区push_back在前面插入数据
- 如何计算特定字符前面的字符数
- 有没有办法把字符串数组成员放在".structurevariable"前面?
- 在 Windows 10 中将一个应用程序放在另一个应用程序前面
- 我们可以在队列前面以 O(1) 时间复杂度排队一个元素吗?
- 具有相同名称的方法和内部类(错误:.. 与前面的声明冲突)
- 我必须将 LL 的最后 n 个元素附加到前面
- JIT 编译器及其在 C++ 前面加快 .NET 中程序执行速度的好处