Cool_Breeze 发表于 2021-8-11 19:09

PySide2 (MDI)学习笔记,遇到大坑



一开始使用的 QMdiSubWindow 类,发现它已经有了布局 QVBoxLayout (竖立,垂直),这个布局不是我需要的;
然后自己 new 了一个水平布局【QHBoxLayout】,希望使用使用 setLayout 【setLayout(QLayout)】 方法覆盖原有布局!但是失败了,
然后就是开启百度查找 怎么更改原有布局,(网上说: 删除原有布局啊【怎么删除不知道,网上也没有】等等。。。)整整折腾了 2 个多小时,中间几度怀疑人生!

最后没办法,要不要自己写一个QMdiSubWindow ?; 点开QMdiSubWindow, 发现它 派生自 QWidget 【Inherits from QWidget.】,
要不试试,也从 QWidget 继承下来写一个 自己的 QMdiSubWindow;
class MySubWindow(QWidget):
    ''' 自定义 mdi 子窗口'''
    def __init__(self, prent = None):
      super().__init__(prent)
      
      self.sList = []
      
      layout = QHBoxLayout()
      
      label = QLabel("拖动滑块改变颜色", self)
      label.setFont(QFont("微软雅黑", 16))
      
      
      s1 = QScrollBar(self)
      s2 = QScrollBar(self)
      s3 = QScrollBar(self)
      s1.setMaximum(255)
      s2.setMaximum(255)
      s3.setMaximum(255)
      self.sList.append(s1)
      self.sList.append(s2)
      self.sList.append(s3)
      
      s1.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      s2.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      s3.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      
      layout.addWidget(s1)
      layout.addWidget(s2)
      layout.addWidget(s3)
      layout.addWidget(label)
      
      self.setLayout(layout)


试试代码能不能跑起来, 卧槽 居然成功了。。。。 卧槽。 槽。槽。槽。槽。

话说回来: 到底怎样才能更改掉QMdiSubWindow 的 布局方式??? 希望大佬们不吝赐教!!!非常感谢!!!

源代码如下:
# -*- coding : utf-8 -*-

from PySide2.QtWidgets import QApplication, QMessageBox, QFileDialog,QMdiSubWindow,QMdiArea,QScrollBar,QHBoxLayout,QVBoxLayout,QLabel,QFormLayout,QWidget
from PySide2.QtUiTools import QUiLoader
from PySide2.QtGui import QPalette,QFont,QColor


import sys
import time
import threading


class WindowMain(object):

    def __init__(self):
      self.ui = QUiLoader().load('MDI.ui') # 加载 ui 文件返回如 MainWindow 类型
      # print(self.ui)
      
      # 工具栏 动作信号连接到槽
      self.ui.actionAdd.triggered.connect(self.createSubWindow)
      self.ui.actiontile.triggered.connect(lambda: self.ui.mdiArea.tileSubWindows())
      self.ui.actioncascade.triggered.connect(lambda: self.ui.mdiArea.cascadeSubWindows())
      self.ui.actionremove.triggered.connect(lambda: self.ui.mdiArea.removeSubWindow(self.ui.mdiArea.currentSubWindow()))
      self.ui.actionclose.triggered.connect(lambda: self.ui.mdiArea.closeActiveSubWindow())
      
   
    # 创建 mdi 子窗口
    def createSubWindow(self):
      sub = MySubWindow()
      sub.setWindowTitle("SUB")
      self.ui.mdiArea.addSubWindow(sub) # 子窗口需要添加到 MDI 窗口
      sub.show() # 需要显示出来
   
    @staticmethod
    def scrollBars(scrollBarList, label):
      r = scrollBarList.value()
      g = scrollBarList.value()
      b = scrollBarList.value()
      
      palette = QPalette()
      palette.setColor(QPalette.Foreground, QColor(r, g, b, 255))
      label.setPalette(palette) # 设置字体颜色


class MySubWindow(QWidget):
    ''' 自定义 mdi 子窗口'''
    def __init__(self, prent = None):
      super().__init__(prent)
      
      self.sList = []
      
      layout = QHBoxLayout()
      
      label = QLabel("拖动滑块改变颜色", self)
      label.setFont(QFont("微软雅黑", 16))
      
      
      s1 = QScrollBar(self)
      s2 = QScrollBar(self)
      s3 = QScrollBar(self)
      s1.setMaximum(255)
      s2.setMaximum(255)
      s3.setMaximum(255)
      self.sList.append(s1)
      self.sList.append(s2)
      self.sList.append(s3)
      
      s1.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      s2.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      s3.sliderMoved.connect(lambda: WindowMain.scrollBars(self.sList, label))
      
      layout.addWidget(s1)
      layout.addWidget(s2)
      layout.addWidget(s3)
      layout.addWidget(label)
      
      self.setLayout(layout)

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

kvttt_2021 发表于 2021-8-11 21:01

你的MDI.ui呢?
页: [1]
查看完整版本: PySide2 (MDI)学习笔记,遇到大坑