PyQt5 自定义信号的简易小例子

PyQt5 自定义信号的简易小例子

记录博文

一、代码

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class TaxRate(QObject):
    rateChanged = pyqtSignal(float)
    def __init__(self):
        super(TaxRate, self).__init__()
        self.__rate = 17.5


    def rate(self):
        return self.__rate


    def setRate(self, rate):
        if rate != self.__rate:
            print("数值不一致,修改数据")
            self.__rate = rate
            self.rateChanged.emit(self.__rate)
        else:
            print("数值一致,不做修改")


def rateChanged(value):
    print("TaxRate 修改为 {0:.2f}%".format(value))


if __name__ == '__main__':
    app = QApplication(sys.argv)

    vat = TaxRate()
    vat.rateChanged.connect(rateChanged)
    a = 17.5
    print("a=%s" %a)
    vat.setRate(a)
    b = 8.5
    print("b=%s" %b)
    vat.setRate(b)      

运行结果:

a=17.5
数值一致,不做修改
b=8.5
数值不一致,修改数据
TaxRate 修改为 8.50%

二、补充说明

rateChanged 叫做信号(Signal)
self.__rate 与 rateChanged 叫槽(Slot)
这个关系被称之为 <信号-槽> 机制

要点1:任何 Python 可调用的对象都可以作为槽
要点2:同一的信号可以连接在不同槽上,不同信号可以连接在同一的槽上。
要点3:阻止<信号-槽>循环(某些情况下,槽会执行一定的操作,操作结果是调用该槽的信号,无论是直接还是间接操作都会再次调用信号,从而发生死循环),解决办法:① 只有信号真正发生改变时,才发射信号;② 只有当用户实际动作时,才发射信号。

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/109146819