qt - 在 X 上运行的 Qt5 程序可以禁用最小化和关闭吗?
问题描述
我正在编写一个在 X 上运行的 C++ Qt5 应用程序。它将在其下运行的窗口管理器是Metacity。我有一些要求我不知道如何解决:
- 窗户不能关闭
- 窗口一定不能最小化
- 窗口必须始终在顶部
我使用以下方法实现了要求 3:
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
但是,右键单击窗口标题仍然会显示一个弹出菜单:
从此菜单中,用户可以关闭“始终位于顶部”设置,并且“最小化”和“关闭”选项仍然可用。我试过了:
setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));
但是,这个功能似乎不能用这个窗口管理器做我想要的,因为没有功能被禁用。
一个后备位置是:
- 如果应用程序曾经关闭,则重新启动应用程序(由于其他原因已经存在)
- 如果窗口被最小化,将其恢复到正常大小
另一个后备位置是:
- 使用
Qt::X11BypassWindowManagerHint
它完全避免了窗口管理器,并以某种方式实现窗口移动和调整大小。
理想情况下,我想继续使用窗口管理器来提供窗口移动和大小功能,但关闭我不需要的功能。
(请尽量避免诸如“你不应该那样做”或“这是一个愚蠢的想法”之类的评论 - 是的,我知道,但这个应用程序不适合一般用途,它只用于专门的环境,它是主题到不是我写的要求。)
解决方案
您最初的问题的简单答案是肯定的。
根据您的问题,我不确定您尝试过的所有组合以及对每种组合都不起作用的组合。目前尚不清楚 Qt::WindowStaysOnTopHint 以外的任何 QtWindowsFlags 是否为您工作。
以下 Qt5 小部件 windowflags 示例提供了可用于测试各种 WindowFlags 行为的内容。
在使用 Window Flags 和 WindowRole 之间,您应该能够通过 XCB 使用 Qt5 设置_NET_WM_ALLOWED_ACTIONS 和 _NET_WM_WINDOW_TYPE ,Metacity 应该按照其合规性文件尊重它。
通过检查源代码,只要调用 recalc_window_features,那么标题栏(如果有)和右键菜单都不应关闭或最小化。相关源代码位于Qt5 端的此处和此处,以及此处在 Metacity 方面,以防您需要进一步修补、跟踪或调试。
正如Scheff所建议的,解决您的问题的一种方法是设置 FramelessWindowHint,但是我相信根据我对代码的检查,您会更幸运地设置窗口标志以触发位于此处的特殊情况。
例如
Qt::WindowFlags flags = windowFlags();
flags |= Qt::CustomizeWindowHint;
flags |= Qt::WindowTitleHint;
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowMinimizeButtonHint;
flags &= ~Qt::WindowMaximizeButtonHint;
flags &= ~Qt::WindowCloseButtonHint;
上面的代码示例未经测试。
我相信您缺少的是CustomizeWindowHint
,如果窗口类型为 QWindow ,则标志将设置为默认值。
另一个可能相关的 Stackoverflow 问题是MainWindow 中的 QDialog 的全屏有时只能工作,但它更多的是让 QDialog 表现得像 QWindow 以绕过 Metacity 错误。
推荐阅读
- php - Php-fpm 可以处理 cli 脚本吗?官方 docker php 内部发生了什么?
- php - Doctrine 在关系中默认不使用惰性获取模式?
- twitter-bootstrap - 在不同断点处将引导程序集合带到上一行?
- sql - 如何在sql中将分钟转换为小时?
- spring - 如何在 sprint rest api 中处理 jersy rest api 响应
- azure-active-directory - Azure 应用注册返回错误代码 AADSTS70001
- powershell - 读取 CSV 第 1 列并将它们保存到变量中
- opendaylight - windows下使用maven生成ODL代码Framework
- php - 在寡妇系统中安装带 lumen 的 mongodb
- php - 地图图片下载错误,图片中没有路线