Gre*_*ill 5 x11 metacity qt qt5
我正在编写在X上运行的C ++ Qt5应用程序。它将在其下运行的窗口管理器是Metacity。我有一些要求,我不确定该如何解决:
我使用以下方式实现了要求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它完全避免了窗口管理器,并实现窗口移动和自己莫名其妙大小。理想情况下,我想继续使用窗口管理器来提供窗口移动和大小功能,但关闭不需要的功能。
(请尽量避免使用诸如“您不应该那样做”或“那是一个愚蠢的主意”之类的评论-是的,我知道,但是此应用程序不是用于一般用途,它仅在专门的环境中使用,并且该主题达到我未写的要求。)
对于您最初的问题,简单的回答是“是”。
根据您的问题,我不确定您尝试过的所有组合以及每种组合中哪些组合不起作用。目前尚不清楚除 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。