全部博文(164)
分类: Python/Ruby
2011-08-29 09:43:13
一,Events
事件是任何GUI程序中最重要的部分。事件由用户或者系统生成,当我们调用应用程序的exec_()方法时,应用程序进入了它的循环,主循环获取事件并将它们送给特定的对象处理。PyQt引入了一种独一无二的信号和插槽来处理事件。
二,信号与插槽(signal and slots)
当用户点击按钮,拖动滑块等操作时会产生信号,同时环境也可以产生信号,比如时钟的信号。插槽是一种针对信号进行处理的方法。Python中的插槽可以是任何的python可调用部分。
# !/usr/bin/python
import sys
from PyQt4 import QtGui, QtCore
class SigSlot(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('signal & slot')
lcd = QtGui.QLCDNumber(self)
slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
vbox = QtGui.QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(slider)
self.setLayout(vbox)
self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)'))
self.resize(250, 150)
app = QtGui.QApplication(sys.argv)
qd = SigSlot()
qd.show()
sys.exit(app.exec_())
上面我们定义了一个LCD number和一个slider,通过拖拽slider来改变LCD的数值。
self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)'))
这一句就是将valueChanged()信号与lcd数字的display()插槽相关联。连接方法有四个参数,sender是发送信号的对象,signal是它产生的信号,receiver是信号接收的对象,最后slot是相应信号的方法。
三,事件处理重载
PyQt中的事件处理主要是通过对事件处理者的重载来进行的。看下面一个例子:
# !/usr/bin/python
import sys
from PyQt4 import QtGui, QtCore
class Escape(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('escape')
self.resize(250, 150)
self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()'))
def keyPressEvent(self, event):
if event.key() ==QtCore.Qt.Key_Escape:
self.close()
app = QtGui.QApplication(sys.argv)
qb = Escape()
qb.show()
sys.exit(app.exec_())
重载了KeyPressEvent()的方法,按下ESC键,程序关闭。
四,发送信号
通过QtCore.Qobject创建对象可以发送信号。如果我们点击按钮,就会产生一个clicked()的信号,看例子:
# !/usr/bin/python
import sys
from PyQt4 import QtGui, QtCore
class Escape(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('escape')
self.resize(250, 150)
self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()'))
def keyPressEvent(self, event):
self.emit(QtCore.SIGNAL(‘closeEmitApp()’))
app = QtGui.QApplication(sys.argv)
qb = Escape()
qb.show()
sys.exit(app.exec_())
创建了一个叫closeEmitApp()的新信号。这个信号是在鼠标按下时产生的。
通过emit()来产生一个信号。
然后将我们手工产生的closeEmitApp()信号与close()插槽连接。