1、信号与槽函数基础
'''
信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行
'''
from PyQt5.QtWidgets import *
import sys class signal(QWidget):
def __init__(self):
super(signal,self).__init__()
self.initUI() #编辑控件及其关联的信号
def initUI(self):
self.resize(300,200)
self.setWindowTitle("信号与槽函数基础") self.b = QPushButton("我的按钮",self) #利用第二个参数self直接可以显示在窗口,不用布局来进行添加控件 #信号与槽函数连接
self.b.clicked.connect(self.onclick) #编辑槽函数
def onclick(self):
self.b.setText("信号已经发出")
self.b.setStyleSheet("QPushButton(max-width:300px;min-width:300px)") if __name__=="__main__":
app=QApplication(sys.argv)
p=signal()
p.show()
sys.exit(app.exec_())

2、自定义信号
'''
对于一个大类的对象,可以自定义实现一种信号
自定义信号的方式
pyqtSignal()信号对象
''' from PyQt5.QtWidgets import *
from PyQt5.QtCore import * #定义一个信号类
class MyTypesignal(QObject): #定义一个信号
senmsg=pyqtSignal(object)
#编写一个信号相关触发的触发函数
def run(self):
self.senmsg.emit("hello PyQT5") #通过run方法来发出message信息hello PyQt5 #定义一个槽函数类
class MySlot(QObject):
def get(self,msg):
print("信息:"+msg) if __name__ == "__main__":
send=MyTypesignal()
slot=MySlot() #将信号与槽函数连接
send.senmsg.connect(slot.get)
send.run()
#将信号与槽函数断开
send.senmsg.disconnect(slot.get)
send.run()

3、发射多个参数的信号
'''
对于一个信号,可以设置通过一个触发函数,发出多个参数
''' from PyQt5.QtWidgets import *
from PyQt5.QtCore import * #定义一个信号类
class MyTypesignal(QObject): #定义一个信号
senmsg=pyqtSignal(object) #指定发出一个参数,类型为object对象
#发射3个参数的信号
senmsg1=pyqtSignal(str,int,int) #编写一个信号相关触发的触发函数
def run(self):
self.senmsg.emit("hello PyQT5") #通过run方法来发出message信息hello PyQt5 def run1(self):
self.senmsg1.emit("hello PyQT5",3,4) # 通过run方法来发出message信息hello PyQt5 #定义一个槽函数类
class MySlot(QObject):
def get(self,msg):
print("信息:"+msg)
def get1(self,msg,a,b):
print(msg,a,b) if __name__ == "__main__":
send=MyTypesignal()
slot=MySlot() #将信号与槽函数连接
send.senmsg.connect(slot.get)
send.senmsg1.connect(slot.get1)
send.run()
send.run1()
#将信号与槽函数断开
send.senmsg.disconnect(slot.get)
send.senmsg1.disconnect(slot.get1)
send.run()
send.run1()

4、为类添加多个信号
'''
为一个类添加多个信号(重载形式信号)
对于一个重载多种形式的参数信号,触发和关联时都需要指定参数类型
''' from PyQt5.QtCore import *
#定义一个信号类
class multisignal(QObject): #定义一个信号
signal1=pyqtSignal()
#定义一个信号的传入参数为int类型
signal2=pyqtSignal(int) signal3=pyqtSignal(int,str) signal4=pyqtSignal(list) signal5=pyqtSignal(dict) #申明一个重载版本的信号,也就是槽函数的参数可以是int和str类型,也可以只有一个str类型的信号
signal6=pyqtSignal([int,str],[str]) def __init__(self):
super(multisignal,self).__init__() 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(10)
self.signal3.emit(1,"hello")
self.signal4.emit([1,2,3,4])
self.signal5.emit({"name":"燕江依","sex":"male"}) #发出参数时也需要指定信号的参数类型,默认关联到第一种类型上去,也就是int+str类型
self.signal6[int,str].emit(20,"test")
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",val,text)
def signalcall4(self, val):
print("signal4 emit,value:", val)
def signalcall5(self,val):
print("signal6 emit",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__":
mul=multisignal()

5、多线程更新UI数据(利用信号与槽函数在两个线程之间传递数据)
from PyQt5.QtCore import QThread,pyqtSignal,QDateTime
from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit
import time
import sys #定义一个动态显示当前时间的线程类
class back(QThread):
update_date=pyqtSignal(str)
def run(self):
while True:
date=QDateTime.currentDateTime()
current=date.toString("yyyy-MM-dd hh:mm:ss")
self.update_date.emit(str(current))
time.sleep(1) #定义一个主窗口
class threadupdate(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setWindowTitle("多线程更新UI数据")
self.resize(400,100)
self.input=QLineEdit(self)
self.input.resize(400,100)
self.initUI() def initUI(self):
self.backend=back()
self.backend.update_date.connect(self.handledisplay)
self.backend.start() #启动线程程序 def handledisplay(self,data):
self.input.setText(data) if __name__=="__main__":
app=QApplication(sys.argv)
p=threadupdate()
p.show()
sys.exit(app.exec_())

6、信号与槽函数实现自动连接
'''
实现的方法详解如下:
1、定义控件的名称,设置控件与信号连接的原则,以名称自动连接
self.button.setObjectName("objectname")
QtCore.QMetaObject.connectSlotsByName(self)
2、槽函数格式为:
@QtCore.pyqtSlot()
def on_objectname_signalname(self):
3、参数说明
(1)objectname必须和关联控件名称一致
(2)signalname必须和控件所需要关联的信号名称一致
''' from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton
import sys class autosignalslot(QWidget):
def __init__(self):
super(autosignalslot,self).__init__()
self.ok=QPushButton("OK",self) #第一步设置关联信号控件按钮的名字
self.ok.setObjectName("okbutton")
self.cancle = QPushButton("cancel",self)
self.cancle.setObjectName("canclebutton") #第二步:设置信号与控件连接的原则
QtCore.QMetaObject.connectSlotsByName(self) layout = QHBoxLayout()
layout.addWidget(self.ok)
layout.addWidget(self.cancle)
self.setLayout(layout) #使用手动定义关联关系来进行信号与槽函数的匹配
#self.ok.clicked.connect(self.on_okbutton) #第三步:定义槽函数:采用自动信号与槽函数之间的关联
@QtCore.pyqtSlot()
def on_okbutton_clicked(self):
print("点击了ok按钮") @QtCore.pyqtSlot()
def on_canclebutton_clicked(self):
print("点击了cancle按钮") if __name__=="__main__":
app=QApplication(sys.argv)
p=autosignalslot()
p.show()
sys.exit(app.exec_())

7、信号与槽函数连接与断开N对N连接
'''
1.一个信号关联多个槽函数
2.一个槽函数可以被多个信号关联
3.一个信号可以关联另外一个信号可以实现触发另外一个信号
'''
from PyQt5.QtCore import * class NNsignal(QObject):
signal1=pyqtSignal()
signal2=pyqtSignal(int)
signal3=pyqtSignal(int) def __init__(self):
super(NNsignal,self).__init__()
#一个信号关联多个槽函数
self.signal1.connect(self.call1)
self.signal1.connect(self.call2)
self.signal2.connect(self.call3) #信号2触发信号3,信号关联信号,需要注意信号传入参数的一致性,不然触发不了
self.signal2.connect(self.signal3) #信号2和信号3关联,直接会触发信号3关联的槽函数
#一个槽函数被多个信号关联
self.signal3.connect(self.call3) self.signal1.emit() #一个信号触发多个槽函数
self.signal2.emit(100)
self.signal2.emit(2) def call1(self):
print("call1 emit")
def call2(self):
print("call2 emit")
def call3(self,int):
print("call3 emit",int) if __name__ == "__main__":
mul=NNsignal()

8、为窗口添加关闭窗口信号

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys class winsignal(QWidget):
buttonsignal=pyqtSignal() def __init__(self):
super(winsignal,self).__init__()
self.setWindowTitle("为窗口类添加窗口关闭信号")
self.resize(300,100) b=QPushButton("关闭窗口",self)
b.clicked.connect(self.b_click)
self.buttonsignal.connect(self.b_close)
def b_click(self):
self.buttonsignal.emit()
def b_close(self):
self.close()
if __name__=="__main__":
app=QApplication(sys.argv)
p=winsignal()
p.show()
sys.exit(app.exec_())

9、lambda表达式为槽函数传递参数
'''
python中的lambda表达式:没有名字的函数:即匿名函数
'''
#不带参数的函数定义
fun=lambda :print("hello world")
fun()
#带参数函数的定义
f=lambda x,y:x*y**2
print(f(3,4)) from PyQt5.QtWidgets import *
import sys
class lambdaslot(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("使用lambda表达式为槽函数传递参数") self.b1=QPushButton("按钮1")
self.b2=QPushButton("按钮2") #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数
self.b1.clicked.connect(lambda: self.onbutton(10, 20))
self.b2.clicked.connect(lambda: self.onbutton(10, -20))
self.b1.clicked.connect(lambda :QMessageBox.information(self,"结果","单击了button1")) lay=QHBoxLayout()
lay.addWidget(self.b1)
lay.addWidget(self.b2) m=QWidget()
m.setLayout(lay)
self.setCentralWidget(m)
#槽函数需要参数,而button点击不能传入参数,可以使用lambda表达式传入参数
def onbutton(self,m,n):
print("m+n=",m+n)
QMessageBox.information(self,"结果",str(m+n)) if __name__ == "__main__":
app = QApplication(sys.argv)
p =lambdaslot()
p.show()
sys.exit(app.exec_())

10、partial对象为槽函数传递参数
'''
python中的lpartial对象
partial(f,参数1,参数2,...)
''' from PyQt5.QtWidgets import *
import sys
from functools import partial class partialslot(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("使用partial对象为槽函数传递参数") self.b1=QPushButton("按钮1")
self.b2=QPushButton("按钮2") #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数
self.b1.clicked.connect(partial(self.onbutton,10,20))
self.b2.clicked.connect(partial(self.onbutton,20,-40)) lay=QHBoxLayout()
lay.addWidget(self.b1)
lay.addWidget(self.b2) m=QWidget()
m.setLayout(lay)
self.setCentralWidget(m) #槽函数需要参数,而button点击不能传入参数,可以使用partial对象传入参数
def onbutton(self,m,n):
print("m+n=",m+n)
QMessageBox.information(self,"结果",str(m+n)) if __name__ == "__main__":
app = QApplication(sys.argv)
p =partialslot()
p.show()
sys.exit(app.exec_())

11、覆盖槽函数(键盘按键信号连接自定义槽函数)
'''
覆盖槽函数
''' from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys #按键信号与槽函数进行关联,自定义属性
class overrideslot(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("覆盖槽函数") #系统里面的按键槽函数与信号连接,可以自定义槽函数里面的功能
def keyPressEvent(self, e):
if e.key()==Qt.Key_Escape:
self.close()
elif e.key()==Qt.Key_Alt:
self.setWindowTitle("按下了ALT键") if __name__ == "__main__":
app = QApplication(sys.argv)
p =overrideslot()
p.show()
sys.exit(app.exec_())



PyQt5信号与槽详解的更多相关文章

  1. QT信号槽详解

    1         QT信号槽详解 1.1  信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...

  2. [ PyQt入门教程 ] PyQt5信号与槽

    信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...

  3. pyqt5信号与槽2

    信号和槽与类的属性和方法在层次上是相同的,同属与一个类的特征. 信号的定义由工厂函数生成: signal=PyQt5.QtCore.pyqtSignal(types[, name[, result[, ...

  4. PyQt5信号与槽关联的两种方式

    目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...

  5. PyQt5信号与槽

    简单使用 可以使用designer的一个模式定义,也可以自己定义,在__init__函数里,self.btn.clicked.connect(self.text.clear). 注意:槽不用加括号,可 ...

  6. django 缓存、中间件、信号、CSRF 详解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ...

  7. linux中信号的API详解实例

    /************************************************************************* > File Name: signal.c ...

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

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

  9. C++框架_之Qt的信号和槽的详解

    C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...

随机推荐

  1. 链接测试工具:Xenu

    Xenu 是一款深受业界好评,并被广泛使用的死链接检测工具.时常检测网站并排除死链接,对网站的 SEO(搜索引擎优化) 非常重要,因为大量死链接存在会降低用户和搜索引擎对网站的信任. 最大支持100线 ...

  2. winform学习(5)MDI窗体

    SDI窗体 single document interface 单文档界面,即单个简单的窗体 MDI窗体 multiple document interface 多文档界面(主窗体与子窗体的关系,避免 ...

  3. alert警告框点击确定后自动提交表单

    转载于  :https://zhidao.baidu.com/question/619375120140398412.html 在页面中有多个input type="text"的文 ...

  4. html滑动

    $('html, body').animate({scrollTop: 1500}, 'fast');

  5. makecert生成证书

    是要命令 makecert -r -pe -n "cn=musetowc" -$ commercial -a sha1 -b 01/01/2020 -e 01/01/2050 -c ...

  6. SpringCloud Netflix Ribbon

    Eureka客户端的负载均衡:从Eureka server拿到节点列表,客户端自己使用负载均衡的算法确定要使用的节点: Eureka服务端的负载均衡:服务端使用负载均衡的算法,从节点列表中确定要使用的 ...

  7. 已解决:解压Python-3.6.1.tar.xz提示tar (child): xz:无法 exec: 没有那个文件或目录

    安装一个xz后解决了 yum install xz 再次解压成功了

  8. Tinyhttp源码分析

    简介 Tinyhttp是一个轻量型Http Server,使用C语言开发,全部代码只500多行,还包括一个简单Client. Tinyhttp程序的逻辑为:一个无线循环,一个请求,创建一个线程,之后线 ...

  9. VIM学习(转)

    原文:http://www.cnblogs.com/nerxious/archive/2012/12/21/2827303.html 断断续续的使用VIM也一年了,会的始终都是那么几个命令,效率极低 ...

  10. 你了解getBoundingClientRect()?

    理解:getBoundingClientRect用于获取某个元素相对于视窗的位置集合.集合中有top, right, bottom, left等属性. 1.语法:这个方法没有参数. rectObjec ...