【发布时间】: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 上测试了不同的桌面环境,发现一些可以工作,而另一些则不能(请参阅更新的问题)。我以后可能会尝试更多,但现在我对解决方法的希望很低。因此,我想我会将赏金奖励给任何对其他地方进行一些测试或为什么它有效或无效的答案,除非有人找到解决方案 - 我不相信。这似乎是一个真正的错误。
标签: linux qt fullscreen pyside always-on-top