Сигналы и слоты:
Функция обратного вызова:
когда мы нажимаем кнопку,Шаги, которые должны быть указаны пальцем::нажмите кнопку --> кнопка отпускания
Кнопка будет иметь три состояния:
Мы моделируем соответствующий код следующим образом:
import time
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('My Signal&Slot Window Окно «Мои сигналы и слоты»)
button = QPushButton('My Push Button моя кнопка')
button.setCheckable(True)
button.clicked.connect(self.the_button_was_clicked)
button.pressed.connect(self.the_button_was_pressed)
button.released.connect(self.the_button_was_released)
self.setCentralWidget(button)
def the_button_was_clicked(self):
print(self.windowTitle(), time.time(), time.strftime('%Y-%m-%d %H:%M:%S'), "Button Clicked")
def the_button_was_pressed(self):
print(self.windowTitle(), time.time(), time.strftime('%Y-%m-%d %H:%M:%S'), "Button Pressed")
def the_button_was_released(self):
print(self.windowTitle(), time.time(), time.strftime('%Y-%m-%d %H:%M:%S'), "Button Released")
if __name__ == '__main__':
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
from PySide6.QtCore import QObject, Signal
class Emitter(QObject):
my_signal_0 = Signal()
my_signal_1 = Signal(str) # Создайте сигнал с 1 параметром
my_signal_2 = Signal(str, str) # Создайте сигнал с 2 параметрами
def emit_signal_0(self):
print('emit_signal_0 Send Signal, No Parameters')
self.my_signal_0.emit() # передавать сигнал
def emit_signal_1(self, a):
print('emit_signal_1 Send Signal, Parameters:', a)
self.my_signal_1.emit(a) # передавать сигнал и передать 1 параметр
def emit_signal_2(self, a, b):
print('emit_signal_2 Send Signal, Parameters:', a, b)
self.my_signal_2.emit(a, b) # передавать сигнал и передать 2 параметра
class Receiver(QObject):
def slot_function_0(self):
print(self.objectName(), "slot_function_0 Received")
def slot_function_1(self, x): # Функция слота принимает 1 параметр
print(self.objectName(), "slot_function_1 Received:", x)
def slot_function_2(self, x, y): # Функция слота принимает 2 параметра
print(self.objectName(), "slot_function_2 Received:", x, y)
if __name__ == '__main__':
# отправитель
emitter = Emitter()
emitter.setObjectName('TestEmitterObj')
# получатель
receiver = Receiver()
receiver.setObjectName('TestReceiverObj')
# Подключение сигналов и функций слотов
emitter.my_signal_0.connect(receiver.slot_function_0)
emitter.my_signal_1.connect(receiver.slot_function_1)
emitter.my_signal_2.connect(receiver.slot_function_2)
# передавать сигнал
emitter.emit_signal_0()
emitter.emit_signal_1('one')
emitter.emit_signal_2('one', 'two')
Ошибка будет выдана, если количество параметров не совпадает при отправке сигнала:
emitter.emit_signal_1('one', 'two')
Перегрузка сигналасуществовать PySide6 не рекомендуется использовать в QT5 Устаревший код может продолжать использовать эту возможность.
Пример кода:
import sys
from PySide6.QtCore import QObject, Signal, Slot
from PySide6.QtWidgets import QApplication
class Communicate(QObject):
# create two new signals on the fly: one will handle
# int type, the other will handle strings
speak = Signal((int,), (str,))
def __init__(self, parent = None):
super().__init__(parent)
self.speak[int].connect(self.say_something)
self.speak[str].connect(self.say_something)
# define a new slot that receives a C 'int' or a 'str'
# and has 'say_something' as its name
@Slot(int)
@Slot(str)
def say_something(self, arg):
if isinstance(arg, int):
print("This is a number:", arg)
elif isinstance(arg, str):
print("This is a string:", arg)
if __name__ == "__main__":
app = QApplication(sys.argv)
someone = Communicate()
# emit 'speak' signal with different arguments.
# we have to specify the str as int is the default
someone.speak.emit(10)
someone.speak[str].emit("Hello everybody!")