QT for PYthon PySide6 GUI界面开发
Demo1_18.py 代码报错
该书中 Demo1_18.py代码,无法正常运行,运行后出现如下提示:
gpy\launcher’ ‘43854’ ‘–’ ‘d:\工具\教程\QTforPythonPyside6GUI界面开发详解与实例实例源代码\Demo1_18.py’
Traceback (most recent call last):
File “d:\工具\教程\QTforPythonPyside6GUI界面开发详解与实例实例源代码\Demo1_18.py”, line 79, in
signalTest = signalDefinition()
File “d:\工具\教程\QTforPythonPyside6GUI界面开发详解与实例实例源代码\Demo1_18.py”, line 24, in init
self.s8[int].connect(self.slot8_1)
IndexError: Signature “s8(int)” not found for signal: “s8”. Available candidates: “s8()”, “s8()”
PS D:\工具\教程\QTforPythonPyside6GUI界面开发详解与实例实例源代码>
原因
估计是作者直接把pyqt5中代码改了一下就拿来用了,因为上述代码在pyqt5中是适用的,不过在PySide6中对信号重载的定义不同,
解决方式:
s8 = Signal((int,),(str,)) #创建重载型信号,相当于创建了两个信号
s9 = Signal((int,str,),(str,),(list,)) #创建重载型信号,相当于创建了3个信号
s10 = Signal((),(bool,)) #创建重载型信号,一个不带参数,另一个带布尔型参数
附:总结PySide6自定义信号要点
1
from PySide6.QtCore import QObject,Signal
2 创建信号
s1 = Signal(int)
s8 = Signal((int,),(str,)) #创建重载型信号,相当于创建了两个信号
s9 = Signal((int,str,),(str,),(list,)) #创建重载型信号,相当于创建了3个信号
s10 = Signal((),(bool,)) #创建重载型信号,一个不带参数,另一个带布尔型参数
3 init 连接槽与信号
self.S1.connect(self.slot1)
self.s8[int].connect(self.slot8_1)
#self.s8.connect(self.slot8_1) #overload型信号的第1个信号可以不指定类型
self.s8[str].connect(self.slot8_2)
self.s9[int,str].connect(self.slot9_1)
#self.s9.connect(self.slot9_1) #overload 型信号的第1个信号可以不指定类型
self.s9[str].connect(self.slot9_2)
self.s9[list].connect(self.slot9_3)
self.s10.connect(self.slot10_1)
self.s10[bool].connect(self.slot10_2)
4 定义槽函数
def slot1(self,value):
print(“s1 emit int”,value)
def slot8_1(self,value):
print(“s8 emit int:”,value)
def slot8_2(self,string):
print(“s8 emit string:”,string)
def slot9_1(self,value,string):
print(“s9 emit int and string:” ,value,string)
def slot9_2(self,string):
print(“s9 emit string”,string)
def slot9_3(self,list_value):
print(“s9 emit list:”,list_value)
def slot10_1(self):
print(“s10 emit”)
def slot10_2(self,value):
print(“s10 emit bool:”,value)
5 init 或 其它 发射信号并传递参数
self.s1.emit(13)
self.s8.emit(200) #
#overload 型信号的第1个信号可以不指定类型
self.s8[str].emit(‘Noise DoWell Tech.’)
self.s9[int,str].emit(300,‘Noise DoWell Tech.’)
#self.s9.emit(300,“Noise DoWell Tech.”) #overload型号的第1个信号可以不指定类型
self.s9[str].emit(‘s9’)
self.s9[list].emit([“s9”,“overload”])
self.s10.emit()
self.s10[bool].emit(True)
附源码
#Demo1_18.py
#自定义信号练习
from PySide6.QtCore import QObject,Signal
#from PyQt5.QtCore import *
class singalDefinition(QObject):
s1 = Signal() #创建无参数信号
s2 = Signal(int) #创建带整数的信号
s3 = Signal(float) #创建带浮点数的信号
s4 = Signal(str) #创建带符串的信号
s5 = Signal(int,float,str) #创建带整数,浮点和字符串的信号
s6 = Signal(list) #创建带列表的信号
s7 = Signal(dict) #创建带字典的信号
s8 = Signal((int,),(str,)) #创建重载型信号,相当于创建了两个信号
s9 = Signal((int,str,),(str,),(list,)) #创建重载型信号,相当于创建了3个信号
s10 = Signal((),(bool,)) #创建重载型信号,一个不带参数,另一个带布尔型参数
def slot1(self):
print("s1 emit")
def slot2(self,value):
print("s2 emit int",value)
def slot3(self,value):
print("s3 emit float",value)
def slot4(self,value):
print("s4 emit string",value)
def slot5(self,value1,value2,string):
print("s5 emit many vlaues",value1,value2,string)
def slot6(self,list_value):
print("s6 emit list:",list_value)
def slot7(self,dict_value):
print("s7 emit dict:",dict_value)
def slot8_1(self,value):
print("s8 emit int:",value)
def slot8_2(self,string):
print("s8 emit string:",string)
def slot9_1(self,value,string):
print("s9 emit int and string:" ,value,string)
def slot9_2(self,string):
print("s9 emit string",string)
def slot9_3(self,list_value):
print("s9 emit list:",list_value)
def slot10_1(self):
print("s10 emit")
def slot10_2(self,value):
print("s10 emit bool:",value)
def __init__(self, parent = None ) :
super().__init__(parent)
self.s1.connect(self.slot1) #信号与槽的连接
self.s2.connect(self.slot2)
self.s3.connect(self.slot3)
self.s4.connect(self.slot4)
self.s5.connect(self.slot5)
self.s6.connect(self.slot6)
self.s7.connect(self.slot7)
self.s8[int].connect(self.slot8_1)
#self.s8[int].connect(self.slot8_1)
# #self.s8.connect(self.slot8_1) #overload型信号的第1个信号可以不指定类型
self.s8[str].connect(self.slot8_2)
self.s9[int,str].connect(self.slot9_1)
# #self.s9.connect(self.slot9_1) #overload 型信号的第1个信号可以不指定类型
self.s9[str].connect(self.slot9_2)
self.s9[list].connect(self.slot9_3)
self.s10.connect(self.slot10_1)
self.s10[bool].connect(self.slot10_2)
self.s1.emit() #emit()函数是一个方法,表示发射信号并传递参数
self.s2.emit(10)
self.s3.emit(11.11)
self.s4.emit('北京诺思多维科技有限公司')
self.s5.emit(100,23.5,'北京诺思多维科技有限公司')
self.s6.emit([1,8,'hello'])
self.s7.emit({1:'Nosie',2:'DoWell'})
self.s8.emit(200) #
#self.s8[int].emit(200)
#self.s8.emit(200) #overload 型信号的第1个信号可以不指定类型
self.s8[str].emit('Noise DoWell Tech.')
self.s9[int,str].emit(300,'Noise DoWell Tech.')
# #self.s9.emit(300,"Noise DoWell Tech.") #overload型号的第1个信号可以不指定类型
self.s9[str].emit('s9')
self.s9[list].emit(["s9","overload"])
self.s10.emit()
self.s10[bool].emit(True)
if __name__ == '__main__':
signalTest = singalDefinition()
深入
关于重载型信号,这个例子还没有更深入的解答