СобытияСобытия это важная часть GUI программирования. События генерируются пользователями или же системой. Когда мы вызываем метод exec() приложение запускает основной цикл. Он получаем события и отправляет их объектам. Trolltech представляет уникальный механизм сигналов и слотов.
Сигналы и слотыСигналы генерируются когда пользователь щелкает по кнопке, отмечает чекбокс и др. Сигналы также могут быть оправлены и окружением. Например, когда срабатывает таймер. Слот — это метод, который реагирует на сигнал.
#!/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)
qb = SigSlot()
qb.show()
sys.exit(app.exec_())
В данном случае мы отображаем бегунок и LCD циферблат. Номер на циферблате изменяется перетаскиванием бегунка.
self.connect(slider, QtCore.SIGNAL(`valueChanged(int)`),
lcd, QtCore.SLOT(`display(int)`))
Здесь мы соединяем сигнал бегунка valueChanged() со слотом display() циферблата.
Метод connect() имеет четыре параметра.
Sender(отправитель) — объект который отправляет сигнал.
Signal (сигнал) — генерируемый сигнал.
Receiver(получатель) — объект, который получает сигнал.
Slot (слот) — метод, который реагирует на сигнал.
Изменение обработчика событияСобытия в PyQt4 обрабатываются в зачастую с помощью изменения обработчиков событий.
#!/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().
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()
Если мы щелкаем по кнопке Escape, то мы закроем приложение.
Генерирование сигналовОбъекты создаваемые из QtCore.QObject могут генерировать сигналы. Если мы щелкаем по кнопке, гененрируется сигнал clicked(). В следующем примере мы покажем как это сделать.
#!/usr/bin/python
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_())
Мы создаём новый сигнал closeEmitApp(). Этот сигнал генерируется когда происходит нажатие кнопки мышки.
def mousePressEvent(self, event):
self.emit(QtCore.SIGNAL(`closeEmitApp()`))
Сигнал создаётся с помощью метода emit().
self.connect(self, QtCore.SIGNAL(`closeEmitApp()`), QtCore.SLOT(`close()`))
Здесь мы соединяет созданный нами сигнал closeEmitApp() со слотом close().