《PyQT4》

事件和信号

含有章节索引的中文 文章模板
::-- zhuyj [2008-06-11 10:01:23]
PyQt4中的事件和信号
In this part of the PyQt4 programming tutorial, we will explore events and singnals occuring in applications.
  • PyQt4编程指导的这一部分,我们将探索事件和信号在程序里的存在。

1.1. 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_()方法时,应用程序进入了它的主循环,主循环获取事件并将他们送给对象处理。奇趣科技引入了一种独一无二的信号和插槽机制来处理事件。

1.2. 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可调用部分。
切换行号显示 切换行号显示
   1 #!/usr/bin/python
2 # sigslot.py
3 import sys
4 from PyQt4 import QtGui, QtCore
5 class SigSlot(QtGui.QWidget):
6 def __init__(self, parent=None):
7 QtGui.QWidget.__init__(self, parent)
8 self.setWindowTitle('signal & slot')
9 lcd = QtGui.QLCDNumber(self)
10 slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
11 vbox = QtGui.QVBoxLayout()
12 vbox.addWidget(lcd)
13 vbox.addWidget(slider)
14 self.setLayout(vbox)
15 self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd,
16 QtCore.SLOT('display(int)') )
17 self.resize(250, 150)
18 app = QtGui.QApplication(sys.argv)
19 qb = SigSlot()
20 qb.show()
21 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

1.3. Reimplementing event handler

事件处理重载
Events in PyQt are processed mainly by reimplementing event handlers .
  • PyQt中的事件处理主要是通过对事件处理者的重载来进行的。
切换行号显示 切换行号显示
   1 #!/usr/bin/python
2 # escape.py
3 import sys
4 from PyQt4 import QtGui, QtCore
5 class Escape(QtGui.QWidget):
6 def __init__(self, parent=None):
7 QtGui.QWidget.__init__(self, parent)
8 self.setWindowTitle('escape')
9 self.resize(250, 150)
10 self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )
11 def keyPressEvent(self, event):
12 if event.key() == QtCore.Qt.Key_Escape:
13 self.close()
14 app = QtGui.QApplication(sys.argv)
15 qb = Escape()
16 qb.show()
17 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键,程序将关闭。

1.4. 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()信号。在以下的例子里我们会看到如何发送一个信号。
切换行号显示 切换行号显示
   1 #!/usr/bin/python
2 # emit.py
3 import sys
4 from PyQt4 import QtGui, QtCore
5 class Emit(QtGui.QWidget):
6 def __init__(self, parent=None):
7 QtGui.QWidget.__init__(self, parent)
8 self.setWindowTitle('emit')
9 self.resize(250, 150)
10 self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )
11 def mousePressEvent(self, event):
12 self.emit(QtCore.SIGNAL('closeEmitApp()'))
13 app = QtGui.QApplication(sys.argv)
14 qb = Emit()
15 qb.show()
16 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()插槽连接。
Add your comment