[英]Buggy MDIWindow in PySide6
我正在使用 PySide6 并且在我的 MDI 区域中有一些奇怪的故障。
下图仅显示了两个生成的 MDIsubwinows。 当我去拖动窗口时,所有历史定位器代码都保留下来,即使我移动另一个菜单之后也是如此。 它也超级滞后。
对于上下文,我使用 Qt Designer 生成 .ui 文件,然后将它们转换为 .py 文件。
这是我的代码:
from PySide6.QtCore import QRect, QCoreApplication, QMetaObject
from PySide6.QtWidgets import QWidget, QHBoxLayout, QMainWindow, QMdiArea, QMenu, QMenuBar, QMdiSubWindow, QApplication
# Converted .ui file from Qt Designer
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(1920, 1080)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayoutWidget = QWidget(self.centralwidget)
self.horizontalLayoutWidget.setObjectName(u"horizontalLayoutWidget")
self.horizontalLayoutWidget.setGeometry(QRect(0, 0, 1920, 1054))
self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setSpacing(7)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.mdiArea = QMdiArea(self.horizontalLayoutWidget)
self.mdiArea.setObjectName(u"mdiArea")
self.horizontalLayout.addWidget(self.mdiArea)
MainWindow.setCentralWidget(self.centralwidget)
self.menuBar = QMenuBar(MainWindow)
self.menuBar.setObjectName(u"menuBar")
self.menuBar.setGeometry(QRect(0, 0, 1920, 26))
self.menuFile = QMenu(self.menuBar)
self.menuFile.setObjectName(u"menuFile")
self.menuEdit = QMenu(self.menuBar)
self.menuEdit.setObjectName(u"menuEdit")
self.menuView = QMenu(self.menuBar)
self.menuView.setObjectName(u"menuView")
self.menuPreferences = QMenu(self.menuBar)
self.menuPreferences.setObjectName(u"menuPreferences")
self.menuWindow = QMenu(self.menuBar)
self.menuWindow.setObjectName(u"menuWindow")
self.menuHelp = QMenu(self.menuBar)
self.menuHelp.setObjectName(u"menuHelp")
self.menuTools = QMenu(self.menuBar)
self.menuTools.setObjectName(u"menuTools")
MainWindow.setMenuBar(self.menuBar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
# retranslateUi
# Converted .ui file from Qt Designer
# Custom class to house the application.
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.initialize_subwindows()
self.ui.mdiArea.tileSubWindows()
# build the menus in readable chunks
# ///////////////////////////////////////////////////////////////
def initialize_subwindows(self):
# Enables the windows to last longer than their create function calls.
self.subwindow_dict = {}
# Create all the subwindows. they should initialize into the subwindows_dict
self.create_build_overview_subwindow()
self.create_object_properties_subwindow()
for window in self.subwindow_dict.values():
self.ui.mdiArea.addSubWindow(window)
self.subwindow_dict.clear()
# the next two functions create subwindows and add them to the main collection of subwindows for the MDI area
def create_build_overview_subwindow(self):
build_overview_window = QMdiSubWindow()
build_overview_window.setWindowTitle('Build Overview')
build_overview_window.show()
self.subwindow_dict.update({'build_overview':build_overview_window})
def create_object_properties_subwindow(self):
object_properties_window = QMdiSubWindow()
object_properties_window.setWindowTitle('Object Properties')
object_properties_window.show()
# Return a dict to add to the subwindow list
# for object perminance
self.subwindow_dict.update({'object_properties':object_properties_window})
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
你不应该叫show
将它添加到区域之前在QMdiSubWindow(自动显示也无妨)。
QMdiSubWindow 设置了一些特殊标志,如果您在将其添加到区域之前尝试调用show()
,理论上它将显示为正常的独立窗口。 show()
还对小部件应用了一些更改,因为它正在初始化(并且在这种情况下作为顶级窗口),因此addSubWindow
所做的事情addSubWindow
变得有些不一致。
解决方案很简单:删除子窗口的所有show()
调用。
请注意,在您的代码中,您没有为中央小部件设置正确的布局,而只是为horizontalLayoutWidget
布局小部件设置了适当的布局,然后它会在主窗口内“浮动”而无法相应地调整其大小。 将 MdiArea 移到该小部件之外,将其删除,因为它没有用,右键单击主窗口的空白区域,然后从“布局”上下文菜单中选择合适的布局。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.