rss
twitter
  • Мой твиттер

События и сигналы в PyQt4 – программирование PyQt4 часть 4

| Posted in python |

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 имеет четыре параметра. Отправитель является объектом, который посылает сигнал. Приемник является объектом, который получает сигнал. Наконец, метод, который реагирует на сигнал.
pyqt4_01

Переполнения и обработка событий

События в 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(). В случае нажатия кнопки мыши этот сигнал сработает.

Добавить комментарий