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

Gre*_*ill 5 x11 metacity qt qt5

我正在编写在X上运行的C ++ Qt5应用程序。它将在其下运行的窗口管理器是Metacity。我有一些要求,我不确定该如何解决:

  1. 窗口一定不能关闭
  2. 窗口一定不能最小化
  3. 窗口必须始终在最上面

我使用以下方式实现了要求3:

setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
Run Code Online (Sandbox Code Playgroud)

但是,右键单击窗口标题仍会显示一个弹出菜单:

在此处输入图片说明

从此菜单中,用户可以关闭“始终在顶部”设置,并且“最小化”和“关闭”选项仍然可用。我试过了:

setWindowFlags(windowFlags() & ~(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint));
Run Code Online (Sandbox Code Playgroud)

但是,此功能似乎无法使用此窗口管理器执行我想要的操作,因为没有功能被禁用。

一个后备位置是:

  • 如果应用程序曾经关闭过,则重新启动它(由于其他原因该应用程序已经存在)
  • 如果将窗口最小化,则将其恢复为正常大小

另一个备用位置是:

  • 使用Qt::X11BypassWindowManagerHint它完全避免了窗口管理器,并实现窗口移动和自己莫名其妙大小。

理想情况下,我想继续使用窗口管理器来提供窗口移动和大小功能,但关闭不需要的功能。


(请尽量避免使用诸如“您不应该那样做”或“那是一个愚蠢的主意”之类的评论-是的,我知道,但是此应用程序不是用于一般用途,它仅在专门的环境中使用,并且该主题达到我未写的要求。)

App*_*234 2

对于您最初的问题,简单的回答是“是”。

根据您的问题,我不确定您尝试过的所有组合以及每种组合中哪些组合不起作用。目前尚不清楚除 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;
Run Code Online (Sandbox Code Playgroud)

上面的代码示例未经测试。

我相信您缺少的是CustomizeWindowHint,如果没有它,如果窗口类型是 QWindow ,则标志将设置为默认值(如下所示

另一个可能相关的 Stackoverflow 问题是Fullscreen for QDialog from inside MainWindow only 有时起作用,但更多的是让 QDialog 表现得像 QWindow 来绕过 Metacity bug。