吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1990|回复: 5
收起左侧

[学习记录] PySide2 信号与槽 学习笔记

[复制链接]
Cool_Breeze 发表于 2021-8-13 11:36
本帖最后由 Cool_Breeze 于 2021-8-13 16:08 编辑

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

[Python] 纯文本查看 复制代码
# -*- 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([int], [str], [define])
    
    # 两个参数,两种类型
    # signal = Signal([int, define], [str, int])
    # 槽函数
    # 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([100, 200, 130]) # 各个控件的大小
        
        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[int] 返回信号对象 可以理解成字典 {key: 对象}
        self.intSignal[int].connect(self.intParmeterSlot)
        self.intSignal[str].connect(self.strParmeterSlot)
        self.intSignal[define].connect(self.defineParmeterSlot)
        
        # 按键内置信号连接不同的槽
        intb.clicked.connect(self.intButClicked)
        strb.clicked.connect(self.strButClicked)
        defineb.clicked.connect(self.defineButClicked)
    
    # 触发
    def intButClicked(self):
        self.intSignal[int].emit(1) # 可以理解成字典 {key: 对象}
    
    def strButClicked(self):
        self.intSignal[str].emit("str")
        
    def defineButClicked(self):
        self.intSignal[define].emit(define(self.intSignal[define])) # 实例化 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_()

免费评分

参与人数 3吾爱币 +6 热心值 +3 收起 理由
liliqingchuan + 1 + 1 我很赞同!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
17777780645 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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的坑吧
 楼主| Cool_Breeze 发表于 2021-8-13 16:10

挺好的啊!感觉 QT 非常好使!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 17:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表