实现不会从全屏应用程序中窃取焦点的通知对话框?
Implementing notification dialogs that don't steal focus from full-screen apps?
我想通过子类化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
函数。
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 如何在点击通知时捕获用户的点击操作
- MFC:如何设置CEdit框的焦点?
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 如何在不设置值的情况下通知 c++ 未来?
- 使用 ISdigit 通知任何检测到的非法字符
- Qt:如何通知对象已建立涉及它的信号槽连接
- 提升进程间named_condition_any不通知
- Windows Toast 通知不适用于 MS CPP 示例代码
- C++ Poco - 如何创建通知队列的向量?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 实现不会从全屏应用程序中窃取焦点的通知对话框?
- 如何获得文本框焦点的通知