PySide6 中的越野车 MDIWindow

Buggy MDIWindow in PySide6

我正在使用 PySide6,但我的 MDI 区域出现了一些奇怪的故障。

下图仅显示了两个生成的 MDI 子窗口。当我去拖动 window 时,所有历史定位输入代码都保留下来,即使我在之后移动另一个菜单也是如此。它也超级懒惰。

对于上下文,我正在使用 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()

你不应该在 QMdiSubWindow 上调用 show,然后 将它添加到该区域(无论如何 自动 显示它) .

QMdiSubWindow 设置了一些特殊标志,如果您尝试在将其添加到区域之前调用 show(),理论上它将显示为 正常 ,独立 window。 show() 还对小部件进行了一些更改,因为它正在初始化(在本例中是作为顶层 window),因此 addSubWindow 所做的事情会因此变得不一致。

解决方案很简单:删除所有 show() 对子 windows 的调用。

请注意,在您的代码中,您没有为中央小部件设置正确的布局,而只是为 horizontalLayoutWidget 设置了适当的布局,然后它在主 window 而无法相应地调整其大小。将 MdiArea 移到该小部件之外,将其删除,因为它没用,右键单击主 window 的空白 space 和 select 从“布局”上下文菜单中选择适当的布局。