Pyside6 + QML - 信号与槽06 - 一个信号触发多个函数
导言
在前面的例子里,我们学习了 QML 与 Python 的方法调用、参数传递、返回值、以及 Python 主动驱动 QML。本篇继续拓展信号与槽的用法:
一个信号可以同时连接多个普通函数。 这意味着,一个事件发生时,可以同时触发多个逻辑处理。
效果如下:
点击GUI的按钮时,同时触发了函数slot_print_message(self)
与函数slot_update_counter(self)
。
工程代码:
- github: https://github.com/q164129345/myPyside6_QML/tree/main/basic07_one_signal_multi_fun
- gitee: https://gitee.com/wallace89/myPyside6_QML/tree/main/basic07_one_signal_multi_fun
一、main.py
# python3.10.11 - PySide6==6.9
import sys
from PySide6.QtCore import QObject, Signal, Slot
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngineclass Backend(QObject):# 定义信号buttonClicked = Signal()def __init__(self):super().__init__()# 将一个信号连接到多个函数self.buttonClicked.connect(self.print_message)self.buttonClicked.connect(self.update_counter)self._counter = 0# 打印信息def print_message(self):print("[Python] 槽函数1:按钮被点击")# 计数器更新def update_counter(self):self._counter += 1print(f"[Python] 槽函数2:按钮点击次数 = {self._counter}")if __name__ == "__main__":# 创建应用程序和引擎app = QGuiApplication(sys.argv)engine = QQmlApplicationEngine()# qml与python交互backend = Backend() # 实例化python后端对象engine.rootContext().setContextProperty("backend", backend) # 注册到QML环境(名叫 “backend”)# 加载QML文件engine.addImportPath(sys.path[0]) # 当前项目路径engine.loadFromModule("Example", "Main") # 模块(Example) + QML文件名(Main.qml)if not engine.rootObjects():sys.exit(-1)sys.exit(app.exec())
关键点说明
self.buttonClicked.connect(self.print_message)
self.buttonClicked.connect(self.update_counter)
- 使用connect()方法关联信号需要触发的函数;
二、Main.qml
import QtQuick
import QtQuick.ControlsWindow {width: 300height: 200visible: truetitle: "信号与槽 05 - 一个信号多个槽"Column {anchors.centerIn: parentspacing: 10Button {text: "点击我 (触发Python信号)"onClicked: {backend.buttonClicked() // 触发 Python 端的信号}}}
}
关键点说明
Button {text: "点击我 (触发Python信号)"onClicked: {backend.buttonClicked() // 触发 Python 端的信号}
}
- QML可以直接调用信号函数。