首先声明,这是学习了别人的文章后写的,原网址
简单地说,就是把上一篇中的
self.connect(exit,QtCore.SIGNAL('triggered()'),QtCore.SLOT('close()'))
改写成
exit.triggered.connect(self.close)
其中exit.triggered是一个signal信号,这里self.close就是槽函数了。
我们先详细讲一下信号和槽之间的关系吧。
信号与槽能让任意的QT对象之间进行通信,信号可以被发射出去,槽可以接受信号。每个QT对象都包含预定的信号和槽。
信号与槽连接常用connect函数,connect(Object1,SIGNAL(signal),Object2,SLOT(slot))
我们来看一下connect函数的三个原型吧
connect(QObject, QT_SIGNAL, QObject, QT_SLOT_QT_SIGNAL, Qt.ConnectionType = Qt.AutoConnection) -> object connect(QObject, QT_SIGNAL, Callable[..., None], Qt.ConnectionType = Qt.AutoConnection) -> object connect(self, QObject, QT_SIGNAL, QT_SLOT_QT_SIGNAL, Qt.ConnectionType = Qt.AutoConnection) -> object
可以看出来没有改过的语句明显调用的是第二个原型,
我们也可以把它写成第一种和第三种形式,分别为
QtGui.QMainWindow.connect(exit,QtCore.SIGNAL('triggered()'),self,QtCore.SLOT('close()'))
QtGui.QMainWindow.connect(self,exit,QtCore.SIGNAL('triggered()'),QtCore.SLOT('close()'))上文说的两个对象,就体现在connect函数中的Object1和Object2,signal是Object1对象的信号,注意要用SIGNAL宏包起来。当一个特定事件发生的时候(如点击按钮)或者Object1调用emit函数的时候,signal信号被发射。slot(槽)就是一个可以被调用处理特定信号的函数(或方法),是普通的对象成员函数。它们存在一些特点:1.一个信号可以与另一个信号相连2.表示一个信号可以与多个槽相连3.表示同一个槽可以响应多个信号
以上特点可以看出信号和槽是宽松地联系在一起的:一个发射信号的对象不用知道也不用注意哪个槽或哪些槽要接收这个信号。对象只负责发送信号,它不知道也不需要知道另一端是谁在接收这个信号。同样的,一个槽也不知道是否有任何信号与自己相连接。
一个简单实例:点击close按钮关闭应用程序
import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) button = QtGui.QPushButton('close', self) button.move(100, 60) self.connect(button, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('close()')) self.setWindowTitle('Signal & slot') self.resize(250, 150) app = QtGui.QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())
我们现在接着来看看自定义插槽。之前讲到exit.triggered是一个signal信号,这里self.close就是槽函数
给出一个例子,点击’change color’按钮,让背景颜色改变吧!
这里写图片描述
import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def change(self): print 'You pressed the butthon' palette = QtGui.QPalette(self) #create a object of class QPalette, default palette.setColor(self.backgroundRole(), QtGui.QColor(192,253,123)) #给调色板设置背景颜色 self.setPalette(palette) #把调色板的属性给self(即QWidget对象) def __init__(self): QtGui.QWidget.__init__(self) button = QtGui.QPushButton('change color', self) button.move(100, 60) self.setWindowTitle('Signal & slot') self.resize(250, 150) button.clicked.connect(self.change) #自定义的change函数 app = QtGui.QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())
详细讲解一下change函数部分吧,
同样地,可以猜测出来palette是QPalette的一个对象,而且是调用的缺省的构造函数。
这里调用的setColor函数原型是setColor(self, QPalette.ColorRole, QColor),(应该是),这一句话就是给调色板添上颜色的。
backgroundRole函数原型是backgroundRole(self) ,返回值类型是 QPalette.ColorRole
setPalette函数的原型是:def setPalette(self, QPalette),可以猜测出来是利用调色板给self设置背景颜色的。
各自函数属于的类是显而易见的,所以上面分析过程中我就没有说了。
change函数也可以这样写。def change(self): print 'You pressed the butthon' palette = QtGui.QPalette(QtGui.QColor(0,0,0)) #这里调用的是带参数的构造函数。 self.setPalette(palette)
以上部分内容转自http:///u011943221/article/details/47007315
因篇幅问题不能全部显示,请点此查看更多更全内容