我有一个基于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甚至还有一些小的额外问题.
Qt::WindowStaysOnTopHint 0x00040000 Informs the window system that the window should stay on top of all other windows. Note that on
some window managers on X11 you also have to pass
Qt::X11BypassWindowManagerHint for this flag to work correctly.
另一件事你为什么要让其他窗口成为一个孩子,如果你在父母的下面呢?