#coding=utf8 ''' 可以通过QObject.emit()给一个组件创建一个自己的信号。 一个信号如果不带有参数(不带有括号,例如atzero),则该信号是一个短路信号。 当一个短路信号被发射,任何数字
'''
可以通过QObject.emit()给一个组件创建一个自己的信号。
一个信号如果不带有参数(不带有括号,例如atzero),则该信号是一个短路信号。
当一个短路信号被发射,任何数字都可以被当做一个详细参数传递给emit()方法,
并且它们作为一个Python对象被传递。
这避免了将参数转换为C ++类型的开销,也意味着可以传递任意Python对象,
该对象不能转换为C ++数据类型。
带有至少一个参数的信号要么是一个Qt信号,要么是一个非短路Python信号。
在这些事例上,PyQt将检查信号是否是一个Qt信号,如果不是,将把该信号作为一个Python信号处理。
不管是Qt信号或者非短路Python信号,参数都将被转换为C++数据类型。
'''
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
#创建一个QSpinBox的类
class ZeroSpinBox(QSpinBox):
#定义一个静态全局变量,用来记录为零的次数
zeros=0
def __init__(self,parent=None):
#调用QSpinBox进行初始化
super(ZeroSpinBox,self).__init__(parent)
#并在调用连接函数在值改变时
#激发信号atzero并返回一个数字
self.connect(self, SIGNAL("valueChanged(int)"),self.checkzero)
def checkzero(self):
#当值为0时
if self.value()==0:
#变量加一
self.zeros +=1
#调用emit函数创建一个SIGNAL并返回一个数字
#这里的信号atzero没有括号是为了告诉PyQt,这是个短路信号。
self.emit(SIGNAL("atzero"),self.zeros)
class Form(QDialog):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
#创建一个ZeroSpinBox对象实例
zerospin=ZeroSpinBox()
#创建一个水平布局的对象实例
hb=QHBoxLayout()
#把ZeroSpinBox对象实例添加到水平布局实例中
hb.addWidget(zerospin)
#把水平布局实例加入Form中
self.setLayout(hb)
#把ZeroSpinBox和Form连接起来
#当信号atzero被激发是,调用announce
#把信号激发是返回的值,传递给announce函数
self.connect(zerospin, SIGNAL("atzero"),self.announce)
#创建一个带有一个参数的函数
def announce(self,zeros):
#打印显示零的次数
print "ZeroSpinBox has been at zero %d times" % zeros
app=QApplication(sys.argv)
form=Form()
form.show()
app.exec_()
运行结果截图: