Pull to refresh

PyQt4 — Сигналы и события

Reading time 3 min
Views 30K
Original author: ZetCode
События
События это важная часть 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().
Tags:
Hubs:
+1
Comments 8
Comments Comments 8

Articles