PyQt - сигналы и слоты
В отличие от приложения консольного режима, которое выполняется последовательно, приложение на основе графического интерфейса пользователя управляется событиями. Функции или методы выполняются в ответ на действия пользователя, такие как нажатие кнопки, выбор элемента из коллекции или щелчок мыши и т. Д., Называемыеevents.
Виджеты, используемые для создания интерфейса GUI, выступают в качестве источника таких событий. Каждый виджет PyQt, производный от класса QObject, предназначен для выдачи 'signal'в ответ на одно или несколько событий. Сам по себе сигнал не выполняет никаких действий. Вместо этого он «подключен» кslot'. Слот может быть любымcallable Python function.
В PyQt связь между сигналом и слотом может быть достигнута разными способами. Ниже приведены наиболее часто используемые методы -
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
Более удобный способ вызвать slot_function, когда виджет испускает сигнал, выглядит следующим образом:
widget.signal.connect(slot_function)
Предположим, если функция должна вызываться при нажатии кнопки. Здесь сигнал clicked должен быть связан с вызываемой функцией. Это может быть достигнуто любым из следующих двух методов:
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()
Приведенный выше код дает следующий вывод -
Вывод
Button 1 clicked
Button 2 clicked