使用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