pyqt5信号与槽详解

yanjy-onlyone yanjy-onlyone     2023-04-18     233

关键词:

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-003(代码片段)

信号处理:  API:    widget信号.connect(信号槽)    obj.disconnect():      取消链接信号与槽      obj:        控件        信号    widget.blockSignal(bool):      临时(取消... 查看详情

pyqt5信号与槽用法进阶(代码片段)

4.高级自定义信号与槽  自定义信号与槽是PyQt5必须掌握的核心玩法,只有4个步骤:  定义信号--> 定义槽函数-->连接-->发射  在使用面向对象方式写代码的时候从上往下的顺序最有可能的是:  定义信号-->... 查看详情

python小白从零开始pyqt5项目实战信号与槽的连接(代码片段)

...,不漏掉一行代码,不省略一个例图。本文讲解信号与槽的连接机制,详细示范各种类型的信号/槽连接的实现方法,这是图形用户界面的核心内容。本文还将介绍面向对象的程序设计&# 查看详情

pyqt5-qtdesignerpyqtsignal()-高级自定义信号与槽(代码片段)

PyQt5信号与槽的几种高级玩法参考:http://www.broadview.com.cn/article/824fromPyQt5.QtCoreimportQObject,pyqtSignalclassCustSignal(QObject):#声明无参数的信号signal1=pyqtSignal()#声明带一个int类型参数的信号signal2=pyqtSignal(int)#声明带int和str类型参数的信号s... 查看详情

自定义信号与槽(代码片段)

...要重写On_Click_Button()就能实现。这个过程就包括了内在的信号-槽连接。而这些关联动作已经在基类中配置好了,故而你不需要指定c 查看详情

pyqt5继承python类可以传递信号函数吗

...自定义对话框之间通过属性传参,另一种在窗口之间使用信号与槽机制传参,这里主要介绍第一种单一窗口的数据传递实例对于具有单一窗口的程序来说,一个控件的变化会影响另一个控件的变化,这中变化利用信号与槽的关系... 查看详情

信号与槽(代码片段)

目录3.1使用信号3.2信号与槽其他的连接方式3.3 如何知道元素有哪些信号3.4自定义信号3.5 本章小结本章会带大家了解如何去使用元素的信号,如何将信号与槽连接起来以及如何自定义信号。QML中的信号与槽机制跟PyQt中的是... 查看详情

信号与槽(代码片段)

目录3.1使用信号3.2信号与槽其他的连接方式3.3 如何知道元素有哪些信号3.4自定义信号3.5 本章小结本章会带大家了解如何去使用元素的信号,如何将信号与槽连接起来以及如何自定义信号。QML中的信号与槽机制跟PyQt中的是... 查看详情

pythonqtgui设计:信号与槽的使用方法(基础篇—7)(代码片段)

目录1、信号与槽的概念2、信号与槽的基础函数2.1、创建信号函数2.2、连接信号函数2.3、断开信号函数2.4、发射信号函数3、信号和槽的使用方法3.1、内置信号与槽的使用3.2、自定义信号与槽的使用3.2.1、定义信号3.2.2、定义槽函... 查看详情

pyqt5中的信号槽的使用

参考技术A1.定义一个信号:使用pyqtSignal进行信号定义,如signal=pyqtSignal(str),表示该信号包含内容都是一个字符串2.连接信号与槽:signal.connect(get_slot),其中get_slot为接收信号的槽函数3.发送信号:signal.emit(“helloworld!”) #push... 查看详情

qt信号与槽(代码片段)

绑定信号与槽时记得绑定在俩都初始化后。如:#include"ccmychardialog.h"publicslots:voidccmyclose();emitmyclose();#include"dialog.h"publicslots:voidccmyclose();myCCmyCharDialog=newCCmyCharDialog(tcpSocket);//绑定关闭信号与槽connect(m 查看详情

信号与槽

1、重点关心信号之间的参数传递多个参数 信号的参数应大于或等于槽函数的参数,参数的类型要一一对应,槽函数也可以不接受参数传递复杂参数 主要通过QVariant进行传递,需要对QVariant提前声明QT5中的新变化  查看详情

qt--信号与槽(代码片段)

信号与槽的关系 当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal),如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(... 查看详情

qt杂记——布局信号与槽

...别设置两个控件的拉伸比例,上述代码中即为1:4显示。2.信号与槽注意事项:connect()中信号与槽函数若有参数只能写类型,不 查看详情

第81课信号与槽的连接方式

1.QObject::connect函数boolconnect(constQObject*sender,//发送者constchar*signal,//信号constQObject*receiver,//接收者constchar*method,//槽函数Qt::ConnectionTypetype=Qt::AutoConnection);//连接方式2.深入信号与槽的连接方式(1)Qt::Dire 查看详情

opencv-pyqt项目实战信号与槽机制(代码片段)

...ff09;QtDesigner和PyUIC快速入门OpenCV-PyQT项目实战(3)信号与槽机制文章目录1.信号与槽(Signalsandslots)1.1信号与槽的原理1.2信号发送者与槽的接收者2.QtDesigner建立信号与槽的连接2.1信号与槽的连接:不同的发送者... 查看详情

qt开发(十三)——qt信号与槽机制

QT开发(十三)——QT信号与槽机制一、QT消息模型QT封装了具体操作系统的消息机制,遵循经典的GUI消息驱动事件模型。QT定义了与操作系统消息相关的自己的概念,即信号与槽。信号signal是由操作系统产生的消息。槽slot是程序... 查看详情

qt--信号与槽机制(代码片段)

一、什么是信号槽机制      信号槽机制是Qt的核心特性,是对C/C++的拓展,应用于对象与对象之间的通信。信号槽的处理依赖于moc(MetaObjectCompiler)工具。      信号槽机制很好地完成了界面操作的响... 查看详情