GitHub连接:
本专栏所有源代码的GitHub直通车

上一篇已经讲了如何去使用对象自带的信号和槽

这一篇是比较绕的,反正我第一次看见,我是挺晕的。在明确一下吧

用下面的这个图来明确一下

首先我们得知道,谁(发送者)发送了什么信号(信号)给谁接受者,谁接收到了信号并去执行了什么函数(槽函数)

先上代码吧

ui文件代码

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '03.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(691, 509)self.verticalLayoutWidget = QtWidgets.QWidget(Form)self.verticalLayoutWidget.setGeometry(QtCore.QRect(100, 60, 391, 231))self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)self.verticalLayout.setContentsMargins(0, 0, 0, 0)self.verticalLayout.setObjectName("verticalLayout")self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_2.setObjectName("pushButton_2")self.verticalLayout.addWidget(self.pushButton_2)self.pushButton_3 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_3.setObjectName("pushButton_3")self.verticalLayout.addWidget(self.pushButton_3)self.pushButton_4 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_4.setObjectName("pushButton_4")self.verticalLayout.addWidget(self.pushButton_4)self.pushButton_1 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_1.setObjectName("pushButton_1")self.verticalLayout.addWidget(self.pushButton_1)self.pushButton_5 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_5.setObjectName("pushButton_5")self.verticalLayout.addWidget(self.pushButton_5)self.label = QtWidgets.QLabel(Form)self.label.setGeometry(QtCore.QRect(140, 340, 411, 81))font = QtGui.QFont()font.setFamily("Agency FB")font.setPointSize(14)self.label.setFont(font)self.label.setObjectName("label")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton_1.setText(_translate("Form", "无参数"))self.pushButton_2.setText(_translate("Form", "一个int型参数"))self.pushButton_3.setText(_translate("Form", "int和str型两个参数"))self.pushButton_4.setText(_translate("Form", "列表作为参数"))self.pushButton_5.setText(_translate("Form", "字典作为参数"))self.label.setText(_translate("Form", "自定义的信号和槽测试,以及带参传递"))

主文件代码:

from ui3 import Ui_Form
import sys,time
from PyQt5 import QtWidgets,QtCoreclass mydesigner(QtWidgets.QWidget,Ui_Form):#定义自定义信号signal_1 = QtCore.pyqtSignal()#不带参数signal_2 = QtCore.pyqtSignal(int)#带int型参数signal_3 = QtCore.pyqtSignal(int,str)#带int和str两个参数signal_4 = QtCore.pyqtSignal(list)#带列表型signal_5 = QtCore.pyqtSignal(dict)#带字典型def __init__(self):super(mydesigner,self).__init__()self.setupUi(self)#为自定义的信号绑定自定义函数,当接收者接收到这个信号的时候,将会执行这个函数self.signal_1.connect(self.signal_1_response)self.signal_2.connect(self.signal_2_response)self.signal_3.connect(self.signal_3_response)self.signal_4.connect(self.signal_4_response)self.signal_5.connect(self.signal_5_response)self.pushButton_1.clicked.connect(self.signal_1_call)self.pushButton_2.clicked.connect(self.signal_2_call)self.pushButton_3.clicked.connect(self.signal_3_call)self.pushButton_4.clicked.connect(self.signal_4_call)self.pushButton_5.clicked.connect(self.signal_5_call)def signal_1_call(self):self.signal_1.emit()def signal_2_call(self):self.signal_2.emit(1)def signal_3_call(self):self.signal_3.emit(1,"test")def signal_4_call(self):self.signal_4.emit([1,2,3,4])def signal_5_call(self):self.signal_5.emit({"name":"huhaoming","age":"20"})#自定义的槽函数def signal_1_response(self):print("不带参数")def signal_2_response(self,val):print("带整形参数:",val)def signal_3_response(self,val_int,val_str):print("带int和str两个参数:",val_int,val_str)def signal_4_response(self,val):print("带列表型:",val)def signal_5_response(self,val):print("带字典型:",val)if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)myshow = mydesigner()myshow.show()sys.exit(app.exec_())

为了能够更好的表达我理解,我用下面的这个图配合代码来讲:

主要理解两行代码就可以

第一:

self.pushButton_1.clicked.connect(self.signal_1_call)

这个意思是主界面按钮点击事件连接着self.signal_1_call这个函数,换一种说法就是当这个按钮点击(不局限与点击,还可以是其它的事件)的时候会去执行self.signal_1_call这个函数,而这个函数就是负责将某个自定义的信号发射出去。在这里是发射给主界面。

第二:

 self.signal_1.connect(self.signal_1_response)

这个的意思就是主界面的这个信号连接着self.signal_1_response这个函数,当主界面接收到这个信号的时候,回去执行,self.signal是主界面的属性,一个信号可以指定连接一个槽函数,这个槽函数就是当你发射这个信号的时候,你希望我去执行的东西。这个槽函数可以直接将参数打印出来。代码中有体现

反正这里是很绕的,不知道各位大佬是怎么学的。弄懂了之后就好受多了(对于强迫症来说)。

**

这个代码可以直接运行的。还有一个点忘记说了,定义自定义信号的时候需用用到pyqtSignal类,所以说信号也可以认为是一个对象,pyqtSignal类在QtCore之下。需要导入

**

对于信号和槽函数的自定义及其传参的时候暂时学习和理解到这里,本篇博客中可能存在错误的地方,仅供参考。后面理解得更好的时候再过来补充。

这个源码也上传到gitHub上面了,连接在博客顶部。

(4)pyqt5教程--->自定义信号和槽(超级绕....)相关推荐

  1. (3)pyqt5教程--->信号与槽初试

    GitHub连接: 本专栏所有源代码的GitHub直通车 上一篇已经讲了如何使用QTdesigner生成ui文件并转化为py文件,最终实现界面代码分离的效果 信号与槽作是 QT 的核心机制,是一种高级 ...

  2. PyQt5 笔记3 -- 信号与槽

    PyQt5 笔记3 – 信号与槽(signals and slots) 学习资料: PyQt5 教程 PyQt5 官方文档 1.信号与槽 QT所有的应用都是事件驱动的.事件大部分都是由用户的行为产生的 ...

  3. PyQt5 随笔:信号与槽的两种使用方法:@pyqtSlot() 和 connect()

    PyQt5 随笔:信号与槽的两种连接方法:@pyqtSlot() 和 connect() 1. @pyqtSlot() @pyqtSlot()有两种使用情况.如下面两个例子. 例子1:一个信号时,如p ...

  4. pyqt5讲解11:自定义信号和槽

    步骤: 定义信号 定义槽函数 连接信号和槽函数 发射信号 代码示例: # -*- coding: utf-8 -*-"""[简介]内置信号槽信号槽示例"&quo ...

  5. Qt5教程(三):自定义信号与槽

    1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...

  6. QT Core | 信号槽03 - 自定义信号与槽

    文章目录 一.前言 二.新建一个QT控制台项目 2.1.New File or Project 2.2.Project Location 2.3.Define Build System 2.4.Kit ...

  7. Qt 自定义信号与槽

    注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...

  8. qt布局调用自定义函数_QT 自定义函数 自定义信号和槽

    使用自定义的信号和槽,需要注意以下几点:1.类的声明和实现分别放在.h和.cpp文件中:2.类声明中包含Q_OBJECT宏:3.信号只要声明不要设计其的实现函数:4.发射信号用emit关键字;5.自定 ...

  9. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

最新文章

  1. shell脚本编程之更多结构化命令
  2. C++ 11 笔记 (四) : std::bind
  3. 神策数据《2022 中国企业数字化运营成熟度报告》发布
  4. (一)javascript面向对象:(1)类
  5. (转)三大博弈定义+结论
  6. F - 上升子序列-超详细注释版
  7. Android RadioButton 语言切换问题
  8. CSS中大小单位px,em,rem 以及微信小程序的rpx
  9. 10款UI设计师常用的UI设计工具盘点
  10. 金彩教育:详情页产品描述怎么写
  11. 【英语四六级-必背单词】高中英语单词 (E)-MP3试听与下载
  12. 计算机word中如何加入水印?
  13. 研发人员的特质_9个有效开发人员的人格特质
  14. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?
  15. Discuz论坛web网页mp3音频播放器源码下载
  16. 视觉定位领域专栏(二)常用数据集介绍
  17. 如何用建好的stm32模板来创建Free-Rtos系统
  18. 转:通信里 星座图 到底是什么
  19. 中华英才网爬虫程序(3)-queue和threading模块的结合使用
  20. Python入门自学进阶——9-网络编程-远程执行命令

热门文章

  1. 英雄联盟服务器现在要维护多久,英雄联盟今日维护时间是多久 lol2020最新维护公告内容是什么...
  2. Compare to 方法详解
  3. compareTo排序规则
  4. 上海市计算机二级vb试题及答案,全国计算机二级《VB》测试题及答案2016
  5. win10网络协议异常怎么办
  6. 大话设计模式:解释器模式
  7. powerdesigner16.6安装教程(附图文安装步骤)
  8. Android 获取客户端外网IP和服务端IP
  9. JavaScript基础语法入门
  10. 深圳一万实际到手工资2014.9.9