3.PyQt5程序自定义信
3.1信 与槽的特定
在PyQt5中信 与槽的特点:
3.2自定义信
在使用PyQt5进行程序设计时,我们可以使用PyQt5.QtCore.pyqtSignal给类定义新的信 。如果要给类定义自定义信 ,该类必须是QObject的子类,同时信 必须定义为类属性。pyqtSignal句法:
pyqtSignal(types[, name[, revision=0[, argiments=[]]]])
其中:
参数types表示参数类型。
其余参数都是可选项,一般不会使用。
信 的函数:
3.3自定义信 示例
本例通过给类定义自定义信 来演示自定义信 的使用。
# coding: utf-8import sysfrom PyQt5.QtCore import QObject, pyqtSignal, pyqtSlotimport jsonclass Student(): def __init__(self, name, sex): self.__name = name self.__sex = sex def getSex(self): return self.__sexclass Class(QObject): # 定义自定义信 classNameChanged = pyqtSignal(str) studentsChanged = pyqtSignal([int], [str]) def __init__(self, parent=None): super().__init__(parent) self.__students = [] def setClassName(self, class_name): self.__className = class_name # 发射信 self.classNameChanged.emit(self.__className) def addStudent(self, student): self.__students.append(student) # 发射信 self.studentsChanged[int].emit(len(self.__students)) result = {'男': 0, '女': 0} for student in self.__students: if student.getSex() == '男': result['男'] += 1 if student.getSex() == '女': result['女'] += 1 # 发射信 self.studentsChanged[str].emit(json.dumps(result))class App(QObject): # 槽函数 @pyqtSlot(str) def do_classNameChanged(self, className): print("班级:" + className) # 槽函数 @pyqtSlot(int) def do_studentsChanged_int(self, num): print("班级总人数:" + str(num)) # 槽函数 @pyqtSlot(str) def do_studentsChanged_str(self, sData): data = json.loads(sData) print("男生人数:" + str(data['男'])) print("女生人数:" + str(data['女']))if __name__ == '__main__': s1 = Student('赵XX', '女') s2 = Student('陈XX', '女') s3 = Student('李XX', '男') s4 = Student('秦XX', '男') s5 = Student('姜XX', '女') s6 = Student('刘XX', '男') s7 = Student('王XX', '男') a = App() c = Class() # 建立信 与槽的关联 c.classNameChanged.connect(a.do_classNameChanged) c.studentsChanged[int].connect(a.do_studentsChanged_int) c.studentsChanged[str].connect(a.do_studentsChanged_str) c.setClassName('计算机2101班') c.addStudent(s1) c.addStudent(s2) c.addStudent(s3) c.addStudent(s4) c.addStudent(s5) # 解除信 与槽的关联 c.studentsChanged[int].disconnect(a.do_studentsChanged_int) c.studentsChanged[str].disconnect(a.do_studentsChanged_str) c.addStudent(s6) c.addStudent(s7)
运行程序,输出的结果如下:
班级:计算机2101班班级总人数:1男生人数:0女生人数:1班级总人数:2男生人数:0女生人数:2班级总人数:3男生人数:1女生人数:2班级总人数:4男生人数:2女生人数:2班级总人数:5男生人数:2女生人数:3
在使用信 与槽的时候,需要特别注意的几点:
1.PyQt5中类的内建overload型信 ,一般只选择其中一种信 编写槽函数,如果使用非默认参数类型的信 ,槽函数需要使用@pyqtSlot()修饰符声明参数类型。
2.自定义信 时,尽量不定义overload型信 。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!