PySide2(MDI)的2种实现方法.

文章讨论了在Pyside2环境下使用MDI(多文档界面)子窗口的两种方法:一种是直接在主窗口中加载.ui文件并处理所有事件,另一种是创建单独的窗口类来处理。第一种方法简化了UI文件的使用,但可能导致主窗口代码复杂;第二种方法则使代码组织更清晰,但需额外转换.ui文件。作者提出了是否能同时使用.ui文件和独立类的问题。
摘要由CSDN通过智能技术生成

使用Pyside2MDI,有2中方法:

方法一:在主窗口中使用.ui文件直接显示,在主窗口中进行处理

如下createSubWindow方法,直接load.ui文件,此时所有的相关的处理文件,必须要在主窗口中实现(s1的sliderMoved信号的关联)。同样如果有其他的响应的实现,也必须要在主窗口中进行实现。

优点:直接使用.ui文件,不需要再次转换为.py,

缺点:相关的实现在主窗口中,是否导致主窗口设计和实现、代码量等更复杂?

方法二:新建一个窗口的进行处理

如createSubWindow2, 创建对了新的实例TestSubWin,将所有的处理都放在class TestSubWin中,显示分明。

和方法一比较,缺点就是方法一的优点。

有没有能够直接使用.ui文件,又可以 新建class?

# -*- coding : utf-8 -*-

from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtUiTools import QUiLoader
from PySide2.QtGui import QPalette, QColor
from ui.subWin import Ui_SubWin as Ui_SubWin
import sys


class WindowMain(object):

    def __init__(self):
        self.ui = QUiLoader().load('ui/MDI.ui')  # 加载 ui 文件返回如 MainWindow 类型
        # 工具栏 动作信号连接到槽
        self.ui.actionAdd.triggered.connect(self.createSubWindow)
        self.ui.actionAdd2.triggered.connect(self.createSubWindow2)
        self.ui.actiontile.triggered.connect(lambda: self.ui.mdiArea.tileSubWindows())
        self.ui.actioncascade.triggered.connect(lambda: self.ui.mdiArea.cascadeSubWindows())
        self.sList = []

    # 创建 mdi 子窗口
    def createSubWindow(self):
        # sub = TestSubWin()
        sub_ui = QUiLoader().load('ui/subWin.ui')
        self.ui.mdiArea.addSubWindow(sub_ui)  # 子窗口需要添加到 MDI 窗口
        tmp = [sub_ui.s1]
        sub_ui.s1.sliderMoved.connect(lambda: self.scrollBars(tmp, sub_ui.label))
        sub_ui.show()

    # 创建 mdi 子窗口
    def createSubWindow2(self):
        sub = TestSubWin()
        self.ui.mdiArea.addSubWindow(sub)  # 子窗口需要添加到 MDI 窗口
        sub.show()

    @staticmethod
    def scrollBars(scrollBarList, label):
        r = scrollBarList[0].value()
        palette = QPalette()
        palette.setColor(QPalette.Foreground, QColor(r, 0, 0, 255))
        label.setPalette(palette)  # 设置字体颜色


class TestSubWin(Ui_SubWin, QWidget):
    def __init__(self):
        super().__init__()
        self.sList = []
        self.setupUi(self)
        self.sList.append(self.s1)
        self.s1.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, self.label))


# 开始运行
app = QApplication(sys.argv)
winMain = WindowMain()
winMain.ui.show()
app.exec_()

 

附转化后的subwin.Py

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'subWin.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *


class Ui_SubWin(object):
    def setupUi(self, SubWin):
        if not SubWin.objectName():
            SubWin.setObjectName(u"SubWin")
        SubWin.resize(668, 485)
        self.gridLayout = QGridLayout(SubWin)
        self.gridLayout.setObjectName(u"gridLayout")
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.s1 = QScrollBar(SubWin)
        self.s1.setObjectName(u"s1")
        self.s1.setMaximum(255)
        self.s1.setOrientation(Qt.Vertical)

        self.verticalLayout.addWidget(self.s1)

        self.verticalLayout.setStretch(0, 10)

        self.horizontalLayout.addLayout(self.verticalLayout)

        self.label = QLabel(SubWin)
        self.label.setObjectName(u"label")

        self.horizontalLayout.addWidget(self.label)

        self.horizontalLayout.setStretch(0, 1)
        self.horizontalLayout.setStretch(1, 10)

        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)


        self.retranslateUi(SubWin)

        QMetaObject.connectSlotsByName(SubWin)
    # setupUi

    def retranslateUi(self, SubWin):
        SubWin.setWindowTitle(QCoreApplication.translate("SubWin", u"SubWin", None))
        self.label.setText(QCoreApplication.translate("SubWin", u"TextLabel", None))
    # retranslateUi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值