PyQt 5信号与槽的几种高级玩法

参考:http://www.broadview.com.cn/article/824

from PyQt5.QtCore import QObject , pyqtSignal

class CustSignal(QObject):

    #声明无参数的信号
signal1 = pyqtSignal() #声明带一个int类型参数的信号
signal2 = pyqtSignal(int) #声明带int和str类型参数的信号
signal3 = pyqtSignal(int,str) #声明带一个列表类型参数的信号
signal4 = pyqtSignal(list) #声明带一个字典类型参数的信号
signal5 = pyqtSignal(dict) #声明一个多重载版本的信号,包括带int和str类型参数的信号和带str类型参数的信号
signal6 = pyqtSignal([int,str], [str]) def __init__(self,parent=None):
super(CustSignal,self).__init__(parent) #将信号连接到指定槽函数
self.signal1.connect(self.signalCall1)
self.signal2.connect(self.signalCall2)
self.signal3.connect(self.signalCall3)
self.signal4.connect(self.signalCall4)
self.signal5.connect(self.signalCall5)
self.signal6[int,str].connect(self.signalCall6)
self.signal6[str].connect(self.signalCall6OverLoad) #发射信号
self.signal1.emit()
self.signal2.emit(1)
self.signal3.emit(1,"text")
self.signal4.emit([1,2,3,4])
self.signal5.emit({"name":"wangwu","age":""})
self.signal6[int,str].emit(1,"text")
self.signal6[str].emit("text") def signalCall1(self):
print("signal1 emit") def signalCall2(self,val):
print("signal2 emit,value:",val) def signalCall3(self,val,text):
print("signal3 emit,value:",val,text) def signalCall4(self,val):
print("signal4 emit,value:",val) def signalCall5(self,val):
print("signal5 emit,value:",val) def signalCall6(self,val,text):
print("signal6 emit,value:",val,text) def signalCall6OverLoad(self,val):
print("signal6 overload emit,value:",val) if __name__ == '__main__':
custSignal = CustSignal()

运行结果:

signal1 emit
signal2 emit,value: 1
signal3 emit,value: 1 text
signal4 emit,value: [1, 2, 3, 4]
signal5 emit,value: {'name': 'wangwu', 'age': ''}
signal6 emit,value: 1 text
signal6 overload emit,value: text

自己写了一遍:

效果如下:

完整代码:

from PyQt5.QtWidgets import (QApplication,QWidget,QPushButton,QTextBrowser,QGridLayout)
from PyQt5.QtCore import Qt,pyqtSignal
import sys class Example(QWidget):
# 声明无参数的信号
signal1 = pyqtSignal()
# 声明带一个int类型参数的信号
signal2 = pyqtSignal(int)
# 声明带int和str类型参数的信号
signal3 = pyqtSignal(int, str)
# 声明带一个列表类型参数的信号
signal4 = pyqtSignal(list)
# 声明带一个字典类型参数的信号
signal5 = pyqtSignal(dict)
# 声明一个多重载版本的信号,包括带int和str类型参数的信号和带str类型参数的信号
signal6 = pyqtSignal([int, str], [str]) def __init__(self):
super(Example, self).__init__()
self.initUI() def initUI(self):
self.setGeometry(300,300,450,380)
self.setWindowTitle("自定义信号与槽练习")
gridLayout = QGridLayout()
self.btn1 = QPushButton("无参数信号")
self.btn2 = QPushButton("int信号")
self.btn3 = QPushButton("int和str信号")
self.btn4 = QPushButton("list信号")
self.btn5 = QPushButton("dict信号")
self.btn6 = QPushButton("多重载信号[int,str],[str]")
self.textBrowser = QTextBrowser()
gridLayout.addWidget(self.textBrowser,0,0,4,12)
gridLayout.addWidget(self.btn1,5,0,1,2)
gridLayout.addWidget(self.btn2,5,2,1,2)
gridLayout.addWidget(self.btn3,5,4,1,2)
gridLayout.addWidget(self.btn4,5,6,1,2)
gridLayout.addWidget(self.btn5,5,8,1,2)
gridLayout.addWidget(self.btn6,5,10,1,2)
self.setLayout(gridLayout)
self.mytxt = ""
#空信号
self.btn1.clicked.connect(self.mySignal1)
self.signal1.connect(self.mySlotFunc1)
#int数字信号
self.btn2.clicked.connect(self.mySignal2)
self.signal2.connect(self.mySlotFunc2)
#int和str(数字和字符串)信号
self.btn3.clicked.connect(self.mySignal3)
self.signal3.connect(self.mySlotFunc3)
#list列表信号
self.btn4.clicked.connect(self.mySignal4)
self.signal4.connect(self.mySlotFunc4)
#dict字典信号
self.btn5.clicked.connect(self.mySignal5)
self.signal5.connect(self.mySlotFunc5)
# 多重载信号 def mySignal1(self):
self.signal1.emit()
def mySlotFunc1(self):
self.mytxt += "无参数的信号"
self.textBrowser.setText(self.mytxt) def mySignal2(self):
self.signal2.emit(123456) def mySlotFunc2(self,val):
self.textBrowser.setText(str(val)) def mySignal3(self):
self.signal3.emit(123456,"这是我的电话号码:") def mySlotFunc3(self, val,text):
self.textBrowser.setText(text+str(val)) def mySignal4(self):
self.signal4.emit([1,5,9,0,0,0,0,1,2,3,4]) def mySlotFunc4(self,li):
print(li)
for i in li:
self.mytxt += str(i)
# print(self.mytxt)
self.textBrowser.setText(self.mytxt) def mySignal5(self):
self.signal5.emit({"phone":90001111,
"addr":["浙江","宁波"]}) def mySlotFunc5(self,mydict):
self.textBrowser.setText(str(mydict["phone"])+str(mydict["addr"][0])+str(mydict["addr"][1])) if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())

【PyQt5-Qt Designer】pyqtSignal()-高级自定义信号与槽的更多相关文章

  1. 第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt ...

  2. QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式

    1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...

  3. Qt之自定义信号和槽函数

    自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...

  4. PyQt5 & Qt Designer使用小结

    开始在知乎写文章的原因,主要还是想整理平时的经验,方便自己以后查看,有机会的话大家也可以交流吧. 11月中旬由于项目需要,和另一名实习生负责使用Python开发一个数据分析的小软件. 虽然才开始接触Q ...

  5. QT自定义信号和槽

    最近项目中使用到QT,在此记录一下QT的核心,信号与槽: QObject::connect(const QObject *sender, const char *signal, const QObje ...

  6. PyCharm+PyQt5+Qt Designer配置

    配置前提 因为本机已经配置完毕了,本次使用的是虚拟机中的Win7系统,Win10系统操作步骤完全一样,无任何区别 PyCharm (这个不多说,官网下载安装,我是用的是2019.3版本) Python ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer中建立CommandLinkButton信号与Action的槽函数连接

    在Qt Designer中,通过F4进行信号和槽函数连接编辑时,接收信号的对象不能是Action对象,但在右侧的编辑界面,可以选择将一个界面对象的信号与Action对象的槽函数连接起来. 如图: 上图 ...

  8. PyQt(Python+Qt)学习随笔:Designer中不能编辑信号和槽的问题

    新建了一个窗口部件,在窗口上添加了相关布局,再设置窗口窗口的布局为垂直布局,窗口设计好界面后如图所示: 可以看到窗口是QWidget类,窗口上从上到下有三个布局,窗口自身的布局为垂直布局,布局名为ve ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中Action的信号

    Action与菜单和工具栏挂接后,只是实现了相关的关联关系,但并不能执行响应操作,真正的响应操作是通过Action的信号与对应槽函数连接实现的. Action提供了4种信号: changed()信号: ...

随机推荐

  1. 聊聊Python中的is和==

    首先,Python中的is就是判断地址是否相等(相当于Java中的==),Python中的==就是判断数值是否相等(相当于Java中的equals). 看个简单的例子: a = [1, 2, 3] b ...

  2. 再战android-语音识别2(修改配置)

    可怕的半桶水一直在晃.程序中需要根据用户的选择设置语音识别的语言(目前科大讯飞支持英文.普通话.粤语),不想每次要用户去IatSetting中去改,需要能直接修改IatSetting的设置.之前移植的 ...

  3. (笔记)Linux内核学习(二)之进程

    一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...

  4. 《深入理解Java虚拟机》读书笔记:垃圾收集器与内存分配策略

    请移步至:http://zhanjindong.info/2014/05/18/java-gc/

  5. centos7目录统计之du命令

    CentOS下du查看计算目录大小的命令 用法实例: [root@localhost local]# du -hs smgpdfd 3.3G    smgpdfd [root@localhost lo ...

  6. Guava学习笔记(二):基础(Joiner,Objects,Splitter及Strings)

    添加Maven依赖 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org.junit ...

  7. Java 简单的rpc 一

    一,简单rpc 是基于Java socket 编程 ServerSocket serverSocket = new ServerSocket(9999); System.out.println(&qu ...

  8. Celery第一步

    一. Celery的架构图: task producer - 任务生产者 顾名思义就是发起调度任务的,然后交给任务队列去处理.简单的Python代码.耦合在Django/Flask Web 服务里请求 ...

  9. 调用百度云Api实现从百度云盘自动下载文件

    一.注册账号 要从百度云下载文件,首先,注册一个百度云账号,现在可能都要注册手机号啦,当然,如果你已经注册过,很幸运,就可以省略掉此步骤啦. 如图登录后所示: 点击Access Key,即显示上面的图 ...

  10. Python代码统计工具

    目录 Python代码统计工具 声明 一. 问题提出 二. 代码实现 三. 效果验证 Python代码统计工具 标签: Python 代码统计 声明 本文将对<Python实现C代码统计工具(一 ...