我想通过子类化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
函数。