含有章节索引的中文 文章模板

::-- zhuyj [2008-06-11 10:01:23]

1. Events and Signals in PyQt4

PyQt4中的事件和信号

In this part of the PyQt4 programming tutorial, we will explore events and singnals occuring in applications.

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.

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.

   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.

 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.

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.

Figure: signal & slot

1.3. Reimplementing event handler

事件处理重载

Events in PyQt are processed mainly by reimplementing event handlers .

   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.

 def keyPressEvent(self, event):
     if event.key() == QtCore.Qt.Key_Escape:
         self.close()

If we click the escape button, we close the application.

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.

   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.

 def mousePressEvent(self, event):
     self.emit(QtCore.SIGNAL('closeEmitApp()'))

Emitting a signal with the emit() method.

 self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )

Here we connect the manually created closeEmitApp() signal with the close() slot.

Events_and_Signals_事件和信号 (last edited 2009-12-25 07:14:25 by localhost)