События и сигналы в PyQt4 – программирование PyQt4 часть 4
| Posted in python | Posted on 18-12-2009
0
События
События являются важной составной частью любом GUI приложении. События генерируются пользователями или системой. Когда мы вызываем exec_ () метод – приложение входит в основной цикл.
Сигналы и Слоты
Сигналы срабатывают, когда пользователь нажимает кнопку, перетаскивает ползунок и т.д. Сигналы так же могут происходить например, когда тикает таймер. Слотом является метод, который реагирует на сигнал.
#!/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_())
В этом примере мы выводим LCD число и ползунок. При перетаскивании ползунка изменяется число.
self.connect(slider, QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)') )
Здесь мы связываемся с помощью valueChanged() к функции display().
Метод connect имеет четыре параметра. Отправитель является объектом, который посылает сигнал. Приемник является объектом, который получает сигнал. Наконец, метод, который реагирует на сигнал.

Переполнения и обработка событий
События в PyQt обрабатываются в основном обработчике событий.
#!/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_())
В нашем примере мы предопределили keyPressEvent () как обработчик событий
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()
Если нажали кнопку Escape – приложение закроется.
Генерируется Объекты, созданные с QtCore.QObject может отдавать сигналы. Если мы нажмем на кнопку, clicked() генерируется сигнал. В следующем примере мы увидим, каким образом мы можем отдавать сигналы.
#!/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_())
Создали новый сигнал closeEmitApp(). В случае нажатия кнопки мыши этот сигнал сработает.

