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.