X 上的 Qt5 程序 运行 可以禁用最小化和关闭吗?
Can a Qt5 program running on X disable minimize and close?
我正在编写 运行X 上的 C++ Qt5 应用程序。window 管理器将 运行 置于 Metacity 之下。我有一些要求我不确定如何解决:
- Window一定不能关闭
- Window一定不能最小化
- Window 必须始终在最前面
我已经使用以下方法实现了要求 3:
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
但是,右键单击 window 标题仍会显示弹出菜单:
从这个菜单中,用户可以关闭 "Always on Top" 设置,最小化和关闭选项仍然可用。我试过:
setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));
但是,此功能似乎无法通过此 window 管理器执行我想要的操作,因为没有功能被禁用。
一个后备位置是:
- 如果应用程序曾经关闭,则重新启动它(由于其他原因,这已经到位)
- 将 window 最小化后恢复到正常大小
另一个后备位置是:
- 使用
Qt::X11BypassWindowManagerHint
完全避开 window 经理,并以某种方式实施 window 移动和调整自己的大小。
理想情况下,我想继续使用 window 管理器来提供 window 移动和调整大小功能,但关闭我不需要的功能。
(请尽量避免像 "well you shouldn't do that" 或 "that's a dumb idea" 这样的评论 - 是的,我知道,但这个应用程序不适合一般用途,它只在特殊环境中使用,并且受要求不是我写的。)
您最初的问题的简单答案是肯定的。
根据你的问题,我不确定你尝试过的所有组合以及哪些组合对每个组合都不起作用。目前尚不清楚除 Qt::WindowStaysOnTopHint 之外的任何 QtWindowsFlags 是否为您工作。
The following Qt5 widgets windowflags example 提供了一些可以用来测试各种 Window 标志的行为的东西。
在使用Window标志之间,Window角色,你应该可以设置_NET_WM_ALLOWED_ACTIONS and _NET_WM_WINDOW_TYPE using Qt5 via XCB and Metacity should respect it as per their compliance文件。
从查看源码只要调用了recalc_window_features,那么无论是标题栏还是右键菜单都不应该有close或者minimize.The相关的源码在这个位置在 here and here on the Qt5 side, and here 在 Metacity 端,以防您需要进一步修补、跟踪或调试。
如 Scheff, one way of solving your problem is setting FramelessWindowHint, however I believe based on my inspection of the code that you will have more luck setting window flags in order to trigger the special case located here 所建议。
例如
Qt::WindowFlags flags = windowFlags();
flags |= Qt::CustomizeWindowHint;
flags |= Qt::WindowTitleHint;
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowMinimizeButtonHint;
flags &= ~Qt::WindowMaximizeButtonHint;
flags &= ~Qt::WindowCloseButtonHint;
上面的代码示例未经测试。
我相信你缺少的是 CustomizeWindowHint
,如果 window 类型是 QWindow,如果没有它,标志将设置为默认值 here .
另一个可能相关的 Whosebug 问题是 Fullscreen for QDialog from within MainWindow only working sometimes,但更多的是让 QDialog 表现得像 QWindow 以绕过 Metacity 错误。
我正在编写 运行X 上的 C++ Qt5 应用程序。window 管理器将 运行 置于 Metacity 之下。我有一些要求我不确定如何解决:
- Window一定不能关闭
- Window一定不能最小化
- Window 必须始终在最前面
我已经使用以下方法实现了要求 3:
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
但是,右键单击 window 标题仍会显示弹出菜单:
从这个菜单中,用户可以关闭 "Always on Top" 设置,最小化和关闭选项仍然可用。我试过:
setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));
但是,此功能似乎无法通过此 window 管理器执行我想要的操作,因为没有功能被禁用。
一个后备位置是:
- 如果应用程序曾经关闭,则重新启动它(由于其他原因,这已经到位)
- 将 window 最小化后恢复到正常大小
另一个后备位置是:
- 使用
Qt::X11BypassWindowManagerHint
完全避开 window 经理,并以某种方式实施 window 移动和调整自己的大小。
理想情况下,我想继续使用 window 管理器来提供 window 移动和调整大小功能,但关闭我不需要的功能。
(请尽量避免像 "well you shouldn't do that" 或 "that's a dumb idea" 这样的评论 - 是的,我知道,但这个应用程序不适合一般用途,它只在特殊环境中使用,并且受要求不是我写的。)
您最初的问题的简单答案是肯定的。
根据你的问题,我不确定你尝试过的所有组合以及哪些组合对每个组合都不起作用。目前尚不清楚除 Qt::WindowStaysOnTopHint 之外的任何 QtWindowsFlags 是否为您工作。
The following Qt5 widgets windowflags example 提供了一些可以用来测试各种 Window 标志的行为的东西。
在使用Window标志之间,Window角色,你应该可以设置_NET_WM_ALLOWED_ACTIONS and _NET_WM_WINDOW_TYPE using Qt5 via XCB and Metacity should respect it as per their compliance文件。
从查看源码只要调用了recalc_window_features,那么无论是标题栏还是右键菜单都不应该有close或者minimize.The相关的源码在这个位置在 here and here on the Qt5 side, and here 在 Metacity 端,以防您需要进一步修补、跟踪或调试。
如 Scheff, one way of solving your problem is setting FramelessWindowHint, however I believe based on my inspection of the code that you will have more luck setting window flags in order to trigger the special case located here 所建议。
例如
Qt::WindowFlags flags = windowFlags();
flags |= Qt::CustomizeWindowHint;
flags |= Qt::WindowTitleHint;
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowMinimizeButtonHint;
flags &= ~Qt::WindowMaximizeButtonHint;
flags &= ~Qt::WindowCloseButtonHint;
上面的代码示例未经测试。
我相信你缺少的是 CustomizeWindowHint
,如果 window 类型是 QWindow,如果没有它,标志将设置为默认值 here .
另一个可能相关的 Whosebug 问题是 Fullscreen for QDialog from within MainWindow only working sometimes,但更多的是让 QDialog 表现得像 QWindow 以绕过 Metacity 错误。