实现不会从全屏应用程序中窃取焦点的通知对话框?



我想通过子类化QDialog来实现一个通知窗口。它应该在其他窗口的顶部,但出于明显的原因,我不希望它从其他窗口窃取焦点。我还担心它会干扰视频和游戏等全屏应用程序。

我该如何着手实现这一点?我可能想了解一些常见的编程和用户体验实践吗?

这似乎是一个相当古老的话题。然而,我没有看到任何人发布一个正确的答案,所以我发布了我最近面临的同样问题的解决方案。

首先,如果您希望对话框不从其他对话框或输入字段窃取焦点,则应设置以下属性:Qt::WA_ShowWithoutActivating。使用此属性,窗口(对话框也是一个窗口)将在未激活的情况下显示。然后,您可能希望根据需要自定义对话框,并且希望此对话框显示在顶部。因此,为了以跨平台的方式实现这样的结果,可以设置以下窗口标志:Qt::FramelessWindowHint|Qt:;NoDropShadowWindowHint| Qt:∶X11BypassWindowManagerHint|Qt::Tool|Qt:::WindowStaysOnTopHint|Q.:WindowTransparentForInput |Qt::WindowDoesNotAcceptFocus

下面的代码是实现无模式对话框的示例之一,并且不会从任何人那里窃取焦点(假设对话框是指向QDialog的有效实例的变量):

dialog->setAttribute(Qt::WA_ShowWithoutActivating, true);
dialog->setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus);

没有尝试过,但看起来像

my_dialog->setWindowFlags(Qt::CustomizeWindowFlags | ... | Qt::WindowStaysOnTopHint);

应该可以工作,同时使其无模式化。

首先需要创建一个非模态对话框:

无模式对话框是一种独立于其他对话框运行的对话框windows。在中查找和替换对话框文字处理器通常是无模式的,以允许用户与应用程序的主窗口和对话框。

为了实现这一点,您需要调用show函数,而不是exec函数。

最新更新