X 上的 Qt5 程序 运行 可以禁用最小化和关闭吗?

Can a Qt5 program running on X disable minimize and close?

我正在编写 运行X 上的 C++ Qt5 应用程序。window 管理器将 运行 置于 Metacity 之下。我有一些要求我不确定如何解决:

  1. Window一定不能关闭
  2. Window一定不能最小化
  3. Window 必须始终在最前面

我已经使用以下方法实现了要求 3:

setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

但是,右键单击 window 标题仍会显示弹出菜单:

从这个菜单中,用户可以关闭 "Always on Top" 设置,最小化和关闭选项仍然可用。我试过:

setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));

但是,此功能似乎无法通过此 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 错误。