一、pyqtSignal基本使用步骤
1.创建自定义信号对象 2.创建槽函数 3.将自定义信号对象与槽函数绑定 4.自定义信号对象发射信号
知识点总结: 自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类 (QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使 用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
(一)控件外使用自定义信号
from PyQt5.QtCore import QObject, pyqtSignal
class MyObject(QObject):
# 1.创建自定义信号对象
mySignal = pyqtSignal()
'''
自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类
(QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使
用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has
no attribute 'connect'
'''
def mySlot(): # 2.创建槽函数
print("控件外自定义信号")
myObject=MyObject()
# 3.将自定义信号对象与槽函数绑定
myObject.mySignal.connect(mySlot)
# 4.自定义信号对象发射信号
myObject.mySignal.emit()
(二)控件外使用自定义信号
知识点总结: 自定信号是Object类的一个类属性。 自定义信号必须在PyQt5的QObject类及其子类 (QWidget/QMainWindow等)中使用,这些类包含“connect”属性,否则,在这些类外面使 用,会报错,提示:AttributeError:'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QWidget,QApplication
import sys
class mywin(QWidget):
# 1.创建自定义信号对象
mySignal=pyqtSignal()
'''
自定信号是Object类的一个类属性。 自定义信号必须在PyQt5中QWidget类及其子类中使
用,这些类包含“connect”属性,否则,在这些类外面使用,会报错,提示:AttributeError:
'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
'''
def __init__(self):
super(mywin, self).__init__()
self.resize(300,200)
self.setUI()
def PrintText(self): # 2.创建槽函数
print('控件内自定义信号')
def setUI(self):
# 3.将自定义信号对象与槽函数绑定
self.mySignal.connect(self.PrintText)
# 4.自定义信号对象发射信号
self.mySignal.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
w=mywin()
w.show()
app.exec()
(三)非QObject类及子类中使用pyqtSignal运行程序报错情形
示例代码如下:
from PyQt5.QtCore import pyqtSignal
signal = pyqtSignal(object)
def Function():
print('测试信号')
signal.connect(Function)
signal.emit()
报错提示如下:
二、参数
(一)参数传递机制
在 PyQt5 中,emit()
方法用于发送信号并可携带相关参数。这些参数的作用是在信号发出时,将数据传递给与该信号连接的槽函数(或其他可调用对象)。
通过在 emit()
方法中指定参数,可以让槽函数接收到这些数据,从而根据传递的数据进行相应的处理。
信号可以定义为接受特定类型的参数,例如:
signal = pyqtSignal(str) # 定义一个只能传递字符串类型参数的信号
在这种情况下,使用 emit()
方法发送信号时,就只能传入字符串类型的参数:
signal.emit("Hello!")
这样,与该信号连接的槽函数在响应时,就可以接收到这个字符串参数 "Hello!"
,并进行相应的处理。
例如,如果有一个槽函数 slot_function
与上述信号连接,它可能定义为:
def slot_function(message): # 槽函数,接收一个字符串参数
print(message)
当信号通过 emit("Hello!")
发送时,slot_function
会被调用,并将 "Hello!"
作为参数传递给它,从而打印出该字符串。
如果信号定义为可以接受多个参数或不同类型的参数,那么在 emit()
方法中也需要按照相应的方式提供这些参数。
这样,通过在 emit()
中传递参数,实现了信号发送者和接收者之间的数据传递,使得槽函数能够根据接收到的具体数据进行灵活的处理,增加了信号与槽机制的灵活性和功能性。可以根据具体的需求,自定义信号携带的参数类型和数量,以满足不同的交互和逻辑处理要求。
知识点总结:
1.在自定义信号时可以指定emit方法传递的参数类型,如int类型参数;
2.emit发送信号时,只能传入自定信号时设置的参数类型,否则会报错;
3.槽函数中设置的参数,不管是任何参数名称,该参数的值都是emit方法传递的数据。
示例代码:
from PyQt5.QtCore import QObject, pyqtSignal
class MyObject(QObject):
# 1.创建自定义信号对象
signal = pyqtSignal(str)
def slot_function(message): # 2.创建槽函数
print(message)
myObject=MyObject()
# 3.将自定义信号对象与槽函数绑定
myObject.signal.connect(slot_function)
# 4.自定义信号对象发射信号
myObject.signal.emit('Hello!')
(二)传递不同数据类型的参数
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) # 重载传递不同参数 ,int str
self.signal6[str].connect(self.signalCall6OverLoad) # str
# 信号发射
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": "25"})
self.signal6[int, str].emit(1, "text")
self.signal6[str].emit("text")
def signalCall1(self): # 无参函数
print("signal1 emit")
def signalCall2(self, val): # int 型参数
print("signal2 emit,value:", val)
def signalCall3(self, val, text): # int str 参数
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): # 重载的 int str
print("signal6 emit,value:", val, text)
def signalCall6OverLoad(self, val): # 重载的 str
print("signal6 overload emit,value:", val)
if __name__ == '__main__':
custSignal = CustSignal()
'''
本段笔记资料来源:https://blog.51cto.com/u_15866638/8545409
'''
(三)参数传递的其他规律
自定义信号中的参数可以传递给槽函数使用。传参方式可以有以下几种: 1.槽函数的参数名称可以自定义信号中的参数名称相同,见槽函数def signalCall1。 2.槽函数的参数名称可以自定义信号中的参数名称不相同,见槽函数def signalCall2,但是传递效果同1。 3.槽函数中参数,可以全部使用自定义信号中的参数,也可以使用一部分,也可以不使用,见def signalCall3,def signalCall4 4.槽函数中的参数,传递自定义信号中的参数,按自定义信号中参数的位置顺序传递,而同槽函数中参数名称的无关,即槽函数的第一个参 数对应自定义信号中的第一个参数,函数的第二个参数对应自定义信号中的第二个参数,顺序依次类推,见def signalCall5。
from PyQt5.QtCore import QObject, pyqtSignal
class CustSignal(QObject):
# 声明带一个int和str类型参数的信号
signal = pyqtSignal(int, str)
def __init__(self, parent=None):
super(CustSignal, self).__init__(parent)
# 信号连接到指定槽
self.signal.connect(self.signalCall1)
self.signal.connect(self.signalCall2)
self.signal.connect(self.signalCall3)
self.signal.connect(self.signalCall4)
self.signal.connect(self.signalCall5)
# 信号发射
self.signal.emit(1, "字符串")
def signalCall1(self, int, str):
print("signal3 emit,value:", int, str)
def signalCall2(self, a, b):
print("signal3 emit,value:", a, b)
def signalCall3(self, a):
print("signal3 emit,value:", a)
def signalCall4(self):
print("signal3 emit,value:")
def signalCall5(self, str, int):
print("signal3 emit,value:", str, int)
if __name__ == '__main__':
custSignal = CustSignal()