Qt非阻塞覆盖对话框

3
我想在Qt 4.8中创建一个对话框,它不会阻塞父对话框,但在打开时仍然保持在其上方。
到目前为止,我尝试过以下内容:

父窗口

下面的代码在Gnome上完全符合我的要求,但在Windows / Mac上,当主窗口获得焦点时,对话框会移到后面:
QMainWindow* window = new QMainWindow();
QDialog* dialog = new QDialog( window );

window->show();
dialog->show();

始终置顶

还有一种可能性是使对话框始终置顶,但我不认为我的应用程序对用户来说如此重要,以至于他希望它甚至在其他应用程序之上:

dialog->setWindowFlags( dialog->windowFlags() | Qt::WindowStaysOnTopHint );

模态对话框

还有一种可能性是创建一个模态对话框。但是这会在对话框打开时阻止用户与主窗口的交互。

dialog->setWindowModality( Qt::WindowModal );

停靠部件

停靠部件基本上做了它应该做的事情。但它也会停靠,而且看起来不像对话框。

我在寻找什么?


你确定吗?我没有在 Mac 上尝试过,但在 Windows 上,我一直按照你的代码操作,对话框始终保持在窗口顶部。 - Fabio
我只有一个正在运行的应用程序(带有许多可能产生副作用的附加代码),已在Windows上进行了测试,现在没有Windows系统可用。但肯定不能在Mac上工作。 - Matthias Kuhn
1个回答

3
我认为你需要的是非模态工具窗口。
QMainWindow* window = new QMainWindow();
QDialog* dialog = new QDialog( window );

Qt::WindowFlags flags = dialog->windowFlags();
dialog->setWindowFlags(flags | Qt::Tool);

window->show();
dialog->show();

从QT文档节选,Qt::Tool标志的含义如下:
表示该窗口部件是一个工具窗口。工具窗口通常是一个带有比通常更小的标题栏和装饰的小窗口,通常用于工具按钮集合。如果有父窗口,则工具窗口将始终保持在其上方。如果没有父窗口,则可以考虑使用Qt::WindowStaysOnTopHint。如果窗口系统支持,工具窗口可以用较轻的框架进行装饰。它也可以与Qt::FramelessWindowHint组合使用。在OS X上,工具窗口对应于浮动窗口类。这意味着该窗口位于普通窗口的上面一层;不可能将普通窗口置于其上方。默认情况下,当应用程序处于非活动状态时,工具窗口将消失。可以通过Qt::WA_MacAlwaysShowToolWindow属性来控制此行为。

谢谢,非常好。然而,窗口在应用程序处于非活动状态时会消失(如文档所述)。不幸的是,在Mac上,Qt::WA_MacAlwaysShowToolWindowQt::WindowStaysOnTopHint相同。您有什么想法可以使其保持在焦点丢失时仅位于此应用程序的顶部吗? - Matthias Kuhn
Mac确实存在一个bug,请查看https://bugreports.qt.io/browse/QTBUG-29816。 - m. c.
再次感谢。看起来已经通过Qt 5.8得到解决了 https://bugreports.qt.io/browse/QTBUG-45938 - Matthias Kuhn
如何仅在某些窗口而非整个应用程序中显示对话框块? - bactone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接