Cool_Breeze 发表于 2021-8-13 11:36

PySide2 信号与槽 学习笔记

本帖最后由 Cool_Breeze 于 2021-8-13 16:08 编辑

更新一个错误 signal 初始化参数问题 如下:
signal = Signal(, [str, int], [list, dict])
槽函数签名如下:
slot(int, define)
slot(str, int)
slot(list, dict)


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

from PySide2.QtWidgets import QApplication,QLabel,QTextEdit,QSplitter,QFrame,QPushButton, QWidget, QMessageBox, QFileDialog,QMainWindow,QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout
from PySide2.QtCore import Qt, Signal, QSize

import sys

class define(object):
    # 自定义信号类型
    # 需要提前定义
   
    def __init__(self, obj = None):
      self.p = 100
      self.obj = obj


class WindowMain(QWidget):

    # *** 注意实例对象不能再添加信号 ***
    # WindowMain 实例不能再添加信号
    # 一个参数,三种类型
    intSignal = Signal(, , )
   
    # 两个参数,两种类型
    # signal = Signal(, )
    # 槽函数
    # slot(int, define)
    # slot(str, int)
   
    def __init__(self):
      super().__init__()
      
      self.resize(800, 600)
      self.setWindowTitle("手动布局(splitter)")
      
      hbox = QHBoxLayout(self)
      
      topleft = QFrame()
      topleft.setFrameShape(QFrame.StyledPanel)
      bottom = QFrame()
      bottom.setFrameShape(QFrame.StyledPanel)
      
      splitter1 = QSplitter(Qt.Horizontal) # 水平布局
      self.textedit = QTextEdit()
      self.strLabel = QLabel()
      splitter1.addWidget(topleft)
      splitter1.addWidget(self.textedit)
      splitter1.addWidget(self.strLabel)
      
      splitter1.setSizes() # 各个控件的大小
      
      splitter2 = QSplitter(Qt.Vertical) # 竖立布局
      splitter2.addWidget(splitter1)
      splitter2.addWidget(bottom)
      
      intb = QPushButton("int")
      strb = QPushButton("str")
      defineb = QPushButton("define")
      
      splitter2.addWidget(strb)
      splitter2.addWidget(defineb)
      
      hbox.addWidget(splitter2)
      hbox.addWidget(intb)
      self.setLayout(hbox)
      
      # 自定义信号连接不同的槽
      # intSignal 返回信号对象 可以理解成字典 {key: 对象}
      self.intSignal.connect(self.intParmeterSlot)
      self.intSignal.connect(self.strParmeterSlot)
      self.intSignal.connect(self.defineParmeterSlot)
      
      # 按键内置信号连接不同的槽
      intb.clicked.connect(self.intButClicked)
      strb.clicked.connect(self.strButClicked)
      defineb.clicked.connect(self.defineButClicked)
   
    # 触发
    def intButClicked(self):
      self.intSignal.emit(1) # 可以理解成字典 {key: 对象}
   
    def strButClicked(self):
      self.intSignal.emit("str")
      
    def defineButClicked(self):
      self.intSignal.emit(define(self.intSignal)) # 实例化 define 类
   
    # 槽函数
    def intParmeterSlot(self, a):
      self.textedit.setText(str(type(a)))
      self.strLabel.setText(str(type(a)))
      
    def strParmeterSlot(self, a):
      self.strLabel.setText(str(type(a)))
      self.textedit.setText(str(type(a)))
   
    def defineParmeterSlot(self, d):
      self.textedit.setText(f"class = {str(type(d))}\ndefine.p = {d.p} \ndefine.obj = {d.obj}")
      self.strLabel.setText(f"class = {str(type(d))}\ndefine.p = {d.p} \ndefine.obj = {d.obj}")


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

Tamluo 发表于 2021-8-13 12:22

感谢楼主分享,一同学习

17777780645 发表于 2021-8-13 12:58

感谢分享

fdtemp 发表于 2021-8-13 13:08

学习学习,感谢分享

Richard_Chiang 发表于 2021-8-13 15:07

早点跳出gui的坑吧{:1_924:}

Cool_Breeze 发表于 2021-8-13 16:10

Richard_Chiang 发表于 2021-8-13 15:07
早点跳出gui的坑吧

挺好的啊!感觉 QT 非常好使!
页: [1]
查看完整版本: PySide2 信号与槽 学习笔记