Учебники

PyQt — Сигналы и слоты

В отличие от приложения в консольном режиме, которое выполняется последовательно, приложение на основе графического интерфейса пользователя управляется событиями. Функции или методы выполняются в ответ на действия пользователя, такие как нажатие кнопки, выбор элемента из коллекции или щелчок мыши и т. Д., Называемые событиями .

Виджеты, используемые для создания интерфейса GUI, служат источником таких событий. Каждый виджет PyQt, производный от класса QObject, предназначен для передачи « сигнала » в ответ на одно или несколько событий. Сигнал сам по себе не выполняет никаких действий. Вместо этого он «подключен» к « слоту ». Слот может быть любой вызываемой функцией Python .

В PyQt соединение между сигналом и слотом может быть достигнуто различными способами. Ниже приведены наиболее часто используемые методы —

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Более удобный способ вызова slot_function, когда виджет испускает виджет, заключается в следующем:

widget.signal.connect(slot_function)

Предположим, должна ли функция вызываться при нажатии кнопки. Здесь нажатый сигнал должен быть подключен к вызываемой функции. Это может быть достигнуто любым из следующих двух методов —

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

или же

button.clicked.connect(slot_function)

пример

В следующем примере два объекта QPushButton (b1 и b2) добавляются в окно QDialog. Мы хотим вызвать функции b1_clicked () и b2_clicked () при нажатии b1 и b2 соответственно.

При нажатии кнопки b1 сигнал clicked () подключается к функции b1_clicked ().

b1.clicked.connect(b1_clicked())

При нажатии кнопки b2 сигнал clicked () подключается к функции b2_clicked ().

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

пример

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

Приведенный выше код производит следующий вывод —