在 Gnome 3 下使用 Qt,Xfce 和 Unity 一个带有子窗口的全屏窗口不会停留在顶部

Posted

技术标签:

【中文标题】在 Gnome 3 下使用 Qt,Xfce 和 Unity 一个带有子窗口的全屏窗口不会停留在顶部【英文标题】:With Qt under Gnome 3, Xfce and Unity a full screen window with a child window doesn't stay on top 【发布时间】:2014-08-15 06:05:18 【问题描述】:

我有一个基于 Qt 的全屏应用程序。全屏应用程序应始终位于顶部,否则部分窗口将被遮挡。我希望无框全屏窗口有子窗口(特殊对话框,..)。这些子窗口应显示在全屏窗口的顶部。在下面显示它们没有多大意义。

一个简短的、独立的例子是:

from PySide import QtGui, QtCore

app = QtGui.QApplication([])

window = QtGui.QWidget(f=QtCore.Qt.WindowStaysOnTopHint)

child_window = QtGui.QWidget(window, f=QtCore.Qt.Window)
child_window.resize(400, 300)

layout = QtGui.QVBoxLayout(window)
exit = QtGui.QPushButton('Exit')
exit.clicked.connect(app.exit)
layout.addWidget(exit)
create = QtGui.QPushButton('Create child window')
create.clicked.connect(child_window.show)
layout.addWidget(create)
layout.addStretch()

window.showFullScreen()

app.exec_()

它是用 Python 编写的,并在 Python 3.X + PySide 1.2.2 (Qt 4.8) + Ubuntu 14.04(Unity 桌面)或 Windows 7 上进行了测试。但是,转换为 C++ Qt(或 PyQt)应该很简单。

观察结果是,在 Windows 上,一切都如开头所述。 Qt.WindowsStaysOnTopHint 不是必需的,而在 Ubuntu 上是必需的。

在 Ubuntu 上,我看到最初全屏主窗口位于所有内容之上,但一旦创建子对话框窗口 通常的桌面装饰(顶部和左侧栏)就会显示在全屏主窗口上方阻碍部分视图!一旦子窗口关闭,全屏窗口就会再次出现在顶部。

现在的问题是,是否有什么办法可以在 Ubuntu 和 Qt 上拥有一个位于顶部的全屏窗口以及子窗口?

Windows 和 Linux 之间的不同行为也不令人满意,因为应尽可能避免使用特定于操作系统的代码。


稍后:

使用the overview of available desktop environment on Ubuntu我安装了几个环境并进行了测试。

KDE、Lubuntu (Lxde?) 和 Openbox 可以按预期工作(并且与 Windows 一样)。全屏显示时主窗口位于顶部,子窗口显示在上方。

但是对于 Gnome-Shell (Gnome 3)、Xfce、Unity 和 Awesome,桌面装饰保持在全屏模式窗口的顶部,子窗口也会显示。 Xfce 和 Unity 表现完全一样,Gnome 和 Awesome 甚至还有一些额外的小问题。

【问题讨论】:

它在其他 Linux 发行版上的表现如何,与 Qt 无关(例如 Debian)?至少在过去,Ubuntu 已经破解了一些 Qt 的东西,试图使其符合他们的特定愿景(即全局菜单栏)。谷歌搜索“ubuntu qt bug menubar fullscreen”的组合会出现很多问题;我不知道 Ubuntu 目前的情况如何,但我已经在 Debian 上完成了带有对话框的全屏应用程序,而且它们运行良好。注意 Ubuntu != Linux ! 在 KDE (Kubuntu) 中它按预期工作。 @doru 很高兴知道。所以我可能需要将范围从 Linux 限制到 Ubuntu。 我昨天尝试了不同的桌面环境:gnome-shell 和 awesome,结果更糟。更新的问题,今晚将进行更多测试。 @timday 抱歉,我现在不想走那么远去尝试其他发行版。我在我的 Ubuntu 上测试了不同的桌面环境,发现一些可以工作,而另一些则不能(请参阅更新的问题)。我以后可能会尝试更多,但现在我对解决方法的希望很低。因此,我想我会将赏金奖励给任何对其他地方进行一些测试或为什么它有效或无效的答案,除非有人找到解决方案 - 我不相信。这似乎是一个真正的错误。 【参考方案1】:

你试过documentation suggests吗?

Qt::WindowStaysOnTopHint 0x00040000 通知窗口系统该窗口应位于所有其他窗口的顶部。请注意,在 X11 上的一些窗口管理器你也必须通过 Qt::X11BypassWindowManagerHint 让这个标志正常工作。

如果你要在父母之下,为什么你希望其他窗口成为孩子?

【讨论】:

我没有尝试X11BypassWindowManagerHint 到目前为止,因为缺少键盘焦点处理等负面影响,但昨天我测试了它并没有达到预期的效果(全屏不再工作如果我没记错的话)。 为什么是子窗口?好吧,这是一个带有子对话框的全屏应用程序,所以这将是自然的方式。此外,子窗口应该主要自动位于父窗口的前面。并且子窗口不会在任务栏中创建额外的条目。但我用独立的窗口尝试过,没有任何改变。更新的问题。 X11BypassWindowManagerHint 传递给子窗口确实会阻止它使桌面装饰可见。您是否设法解决/解决了这个问题?

以上是关于在 Gnome 3 下使用 Qt,Xfce 和 Unity 一个带有子窗口的全屏窗口不会停留在顶部的主要内容,如果未能解决你的问题,请参考以下文章

KDEGNOME 和 XFCE 桌面比较

Debian9 - 桌面的选择gnome xfce

debian安装桌面

在ubuntu上安装了xfce之后磁盘不见了

kali2020.1 xfce换gnome桌面环境

银河麒麟安装与使用 xfce 桌面环境