PyQt5 - сигналы и слоты
В отличие от приложения консольного режима, которое выполняется последовательно, приложение на основе графического интерфейса пользователя управляется событиями. Функции или методы выполняются в ответ на действия пользователя, такие как нажатие кнопки, выбор элемента из коллекции или щелчок мышью и т. Д., Называемыеevents.
Виджеты, используемые для построения интерфейса GUI, выступают в качестве источника таких событий. Каждый виджет PyQt, производный от класса QObject, предназначен для выдачи‘signal’в ответ на одно или несколько событий. Сам по себе сигнал не выполняет никаких действий. Вместо этого он «подключен» к‘slot’. Слот может быть любымcallable Python function.
Использование редактора сигналов / слотов Qt Designer
Сначала создайте простую форму с помощью элемента управления LineEdit и PushButton.
Желательно, чтобы при нажатии кнопки содержимое текстового поля стиралось. Для этого в виджете QLineEdit есть метод clear (). Следовательно, кнопкаclicked сигнал должен быть подключен к clear() метод текстового поля.
Для начала выберите Edit signal / slots в меню Edit (или нажмите F4). Затем выделите кнопку мышью и перетащите курсор в сторону текстового поля.
Когда мышь будет отпущена, отобразится диалоговое окно, показывающее сигналы кнопки и методы слота. Выберите щелкнувший сигнал и метод clear ()
Окно редактора сигналов / слотов в правом нижнем углу покажет результат -
Сохраните пользовательский интерфейс и код сборки и Python из файла пользовательского интерфейса, как показано в приведенном ниже коде -
pyuic5 -x signalslot.ui -o signalslot.py
Сгенерированный код Python будет иметь связь между сигналом и слотом с помощью следующего оператора:
self.pushButton.clicked.connect(self.lineEdit.clear)
Запустите signallot.py и введите текст в LineEdit. Текст будет очищен при нажатии кнопки.
Подключение сигнального разъема здания
Вместо использования Designer вы можете напрямую установить соединение сигнального слота, используя следующий синтаксис:
widget.signal.connect(slot_function)
Предположим, если функция должна вызываться при нажатии кнопки. Здесь сигнал clicked должен быть связан с вызываемой функцией. Это может быть достигнуто любым из следующих методов -
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 ().
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
b2.clicked.connect(b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt5")
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