Программирование графического интерфейса PySide6 (3): механизм сигналов и слотов
Программирование графического интерфейса PySide6 (3): механизм сигналов и слотов

Внутренняя логика сигналов и слотов

Логическое объединение сигналов и слотов
Логическое объединение сигналов и слотов

Сигналы и слоты:

  • слабая связь,отправительненужныйсосредоточиться наполучательинформация об интерфейсе
  • Получатель выполняет действия асинхронно
  • Общая эффективность выполнения действий ниже, чем у callback-функций.

Функция обратного вызова:

  • Сильная связь: вызывающая сторона и вызываемая сторона должны соответствовать спецификации интерфейса обратного вызова (например, спецификации параметров интерфейса).
  • Выполнение функции обратного вызова синхронно
  • Общая эффективность выполнения действий выше, чем у сигналов и слотов.

Возьмите нажатие кнопки QPushButton в качестве примера.

Разбор состояния нажатия кнопки
Разбор состояния нажатия кнопки

когда мы нажимаем кнопку,Шаги, которые должны быть указаны пальцем::нажмите кнопку --> кнопка отпускания

Кнопка будет иметь три состояния:

  • кнопка нажата
  • кнопка отпущена
  • Кнопка завершила нажатие Последнее состояние генерируется после завершения нажатия и отпускания.

Мы моделируем соответствующий код следующим образом:

Язык кода:python
кодКоличество запусков:0
копировать
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()
Отображение сигналов и действий при нажатии кнопки
Отображение сигналов и действий при нажатии кнопки
Эффект операции
Эффект операции
  • когданажмите кнопка после кнопки на месте отпускания,Содержимое, показанное в красном поле, будет напечатано.,Это потому, что клик действительно был завершен;
  • После нажатия кнопки перетащите ее пальцем в другие области за пределами кнопки.,Появится содержимое зеленого поля.,Потому что клик в данный момент не завершается,Вместо этого попробуйте перетащить кнопку после ее нажатия.

Пользовательские сигналы и слоты

Язык кода:python
кодКоличество запусков:0
копировать
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 Устаревший код может продолжать использовать эту возможность.

Перегрузка сигнала
Перегрузка сигнала

Пример кода:

Язык кода:python
кодКоличество запусков:0
копировать
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!")
Эффект операции
Эффект операции
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода