## page was renamed from zhArticleTemplate ##language:zh #pragma section-numbers on ''' 含有章节索引的中文 文章模板 ''' ::-- [[zhuyj]] [<>] <> = Events and Signals in PyQt4 = '''PyQt4中的事件和信号''' '' In this part of the PyQt4 programming tutorial, we will explore events and singnals occuring in applications.'' . 在PyQt4编程指导的这一部分,我们将探索事件和信号在程序里的存在。 == Events == '''事件''' '' Events are an important part in any GUI program. Events are generated by users or by the system. When we call the application's exec_() method, the application enters the main loop. The main loop fetches events and sends them to the objects. Trolltech has introduced a unique signal and slot mechanism.'' . 事件是任何GUI程序中最重要的部分。事件由用户或者系统生成,当我们调用应用程序的exec_()方法时,应用程序进入了它的主循环,主循环获取事件并将他们送给对象处理。奇趣科技引入了一种独一无二的信号和插槽机制来处理事件。 == Signals & Slots == '''信号和插槽''' ''Signals are emitted, when users click on the button, drag a slider etc. Signals can be emitted also by the environment. For example, when a clock ticks. A slot is a method, that reacts to a signal. In python, a slot can be any python callable. '' . 当用户点击按钮,拖动滑块等操作时会产生信号,同时环境也可以产生信号,比如时钟的信号。插槽是一种针对信号进行处理的方法。python中插槽可以是任何的python可调用部分。 {{{ #!python #!/usr/bin/python # sigslot.py 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) qb = SigSlot() qb.show() sys.exit(app.exec_()) }}} '' In our example, we display an lcd number and a slider. We change the lcd number by dragging the slider. '' . 在这个例子中,我们显示一个lcd数字和一个滑块,我们可以通过拖拽滑块来改变lcs的数字显示。 {{{ self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)') ) }}} '' Here we connect a valueChanged() signal of the slider to the display() slot of the lcd number.'' . 这里我们将滑块的valueChanged()信号与lcd数字的display()插槽相关联。 '' The connect method has four parameters. The sender is an object that sends a signal. The signal is the signal, which is emitted. The receiver is the object, that receives the signal. Finally the slot is the method, that reacts to the signal.'' . 连接方法有四个参数。sender是发送信号的对象,signal是它产生的信号,receiver是接收信号的对象,最后的slot是相应信号的方法。 . signals & slots Figure: signal & slot == Reimplementing event handler == '''事件处理重载''' '' Events in PyQt are processed mainly by reimplementing event handlers .'' . PyQt中的事件处理主要是通过对事件处理者的重载来进行的。 {{{ #!python #!/usr/bin/python # escape.py 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_()) }}} '' In our example, we reimplement the keyPressEvent() event handler.'' . 在这个例子里,我们重载了keyPressEvent()方法。 {{{ def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() }}} '' If we click the escape button, we close the application.'' . 如果我们按下ESC键,程序将关闭。 == Emitting signals == 发送信号 '' Objects created from QtCore.QObject can emit signals. If we click on the button, a clicked() signal is generated. In the following example we will see, how we can emit signals.'' . 通过QtCore.QObject创建的对象可以发送信号。如果我们点击按钮,就会生成一个clicked()信号。在以下的例子里我们会看到如何发送一个信号。 {{{ #!python #!/usr/bin/python # emit.py import sys from PyQt4 import QtGui, QtCore class Emit(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('emit') self.resize(250, 150) self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') ) def mousePressEvent(self, event): self.emit(QtCore.SIGNAL('closeEmitApp()')) app = QtGui.QApplication(sys.argv) qb = Emit() qb.show() sys.exit(app.exec_()) }}} '' We create a new signal called closeEmitApp(). This signal is emitted, during a mouse press event. '' . 我们创建一个叫做closeEmitApp()的新的信号。这个信号在鼠标按下时产生。 {{{ def mousePressEvent(self, event): self.emit(QtCore.SIGNAL('closeEmitApp()')) }}} '' Emitting a signal with the emit() method.'' . 通过emit()来产生一个信号。 {{{ self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') ) }}} '' Here we connect the manually created closeEmitApp() signal with the close() slot.'' . 这里我们将我们手工产生的closeEmitApp()信号与close()插槽连接。