#!/usr/bin/env python
#coding:utf-8
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class Signal(QtGui.QWidget):
def __init__(self,parent = None):
QtGui.QWidget.__init__(self,parent)
self.setGeometry(300,300,250,150)
self.setWindowTitle('Button')
okButton = QtGui.QPushButton('OK')
closeButton = QtGui.QPushButton('CLOSE')
layout = QtGui.QHBoxLayout()
layout.addStretch(1)
layout.addWidget(okButton)
layout.addWidget(closeButton)
self.setLayout(layout)
self.connect(closeButton,QtCore.SIGNAL('clicked()'),QtGui.qApp,QtCore.SLOT('quit()'))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
widget = Signal()
widget.show()
app.exec_()
整个程序实现的功能是点击CLOSE按钮,就会退出窗体,这个过程中应用到了PyQt的信号与槽机制,代码实现如下,代码:
|
connect函数中,第一个参数是发送信号的对象,这里为closeButton; 第二个参数表示传递的信号。在程序运行后的窗体中会有一个CLOSE按钮,那么我们点击CLOSE按钮,就会触发时间,传递一个信号给接收对象; 第三个参数表示信号接收对象; 第四个参数是槽函数,也就是处理信号的方法,这个方法可以是任何Python调用,在本程序中,信号的处理方法是退出窗体。为什么会退出主界面了?因为我们这里用的是主界面的connect()方法。除了这个方法之外,还有另外一个连接事件的方法-----控件本身的connect方法。下面再看一个脚本
#!/usr/bin/python
# quitbutton.py
import sys
from PyQt4 import QtGui, QtCore
class Event(QtGui.QWidget):
def __init__(self,parent = None):
QtGui.QMainWindow.__init__(self,parent)
self.initGUI()
self.resize(100,300)
def initGUI(self):
closeButton = QtGui.QPushButton('CLOSE',self)
#closeButton.clicked.connect(self.close)
closeButton.clicked.connect(closeButton.close)
def main():
app = QtGui.QApplication(sys.argv)
widget = Event()
widget.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
注意这两行代码
#closeButton.clicked.connect(self.close)
closeButton.clicked.connect(closeButton.close)
第一行代码达到的效果是:点击CLOSE按钮,将退出窗口;而第二行代码,因为调用close()函数的对象变成了closeButton,因此,运行程序之后,点击CLOSE按钮,并不会退出窗口,而是将closeButton这个button部件给“删除”了,窗口依然存在,但是你会发现CLOSE按钮“消失”了!当然,如果只是让CLOSE按钮消失,我们也可以这样写:
self.connect(closeButton,QtCore.SIGNAL(’clicked()‘),closeButton,QtCore.SLOT('close')),注意第一个参数和第三个参数,是同一个对象,因为我们操作的就是同一个对象!这样同样会达到让CLOSE按钮“消失”的效果。不过两种方法比较,“控件本身的”conncet方法看起来更加符合Python的标准。
因此,我们说连接事件的方法有两种,一种是通过主界面的connect,第二种是通过某个空间本身的connect方法,比如这里的按钮控件。(不知道这么说对不对,看到的同学如果认为有问题的,还请指正!)
文章我会不断的完善,程序运行在linux下通过,程序没有做注解,运行结果图也没有贴上来,有兴趣的朋友可以自己尝试一下。