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进行处理,非常感谢!