[英]PyQt5 keep a QWidget always on top
在我的主窗口 init 函数中创建时,我可以强制子小部件保持在顶部吗?
当在应用程序范围内创建小部件时,它只对我有用(如这里PyQt4 How keep a QWidget always on top? )。
(在树莓派操作系统上测试)
from PyQt5 import QtCore
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QWidget
)
class Ui_MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle("MainWindow")
self.resize(400, 300)
Widget = Ui_Widget(self)
Widget.show()
class Ui_Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog)
self.setWindowTitle("Widget")
self.resize(400, 300)
self.move(200, 150)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = Ui_MainWindow()
MainWindow.show()
# Widget = Ui_Widget(MainWindow)
# Widget.show()
sys.exit(app.exec_())
问题可能与窗口管理器中的一些错误或错误实现有关(在 Fluxbox 上它按预期工作)。
在任何情况下,为了一致性,您不应该在显示父级之前显示子级小部件(假设两者必须同时出现):在处理__init__
之后调用MainWindow.show()
,结果是您'过早地显示子小部件。
一个基本的解决方法是在显示子小部件之前调用self.show()
,但通常认为在__init__
不显示小部件(包括实例本身)是一种很好的做法。
更好的解决方案是创建一个实际显示父小部件的函数,然后创建并显示子小部件:
class Ui_MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle("MainWindow")
self.resize(400, 300)
def start(self):
self.show()
Widget = Ui_Widget(self)
Widget.show()
# ...
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = Ui_MainWindow()
MainWindow.start()
sys.exit(app.exec_())
请注意,对于非常特定的情况,通常需要为标准 QWidget 使用Dialog
标志。 大多数情况下,您可以只使用 QDialog 并调用open()
而不是show()
。 您还应该为子窗口小部件创建一个持久引用,因为您可能需要从主窗口类访问它。
另请注意,名为Ui_xyz
类通常用于基本 UI 表单(使用 pyuic/pyside-uic 创建的那些),并且变量不应使用大写名称,因为只有类和常量使用此约定(首选mainWindow
而不是MainWindow
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.