Pyside6 + QML - 信号与槽07 - 一个函数被多个信号触发
导言
在前面的例子里,我们学习了“一个信号连接多个槽”,实现了一个事件驱动多段逻辑。
本篇介绍反过来的用法:一个函数可以同时响应多个信号。
这种模式适用于以下场景:
- 界面上有多个按钮,但它们最终都需要调用同一段处理逻辑(例如日志、统一的控制命令)。
- 不同事件类型,可以通过参数区分,由同一个函数来集中处理。
效果如下所示:
工程代码: - github: https://github.com/q164129345/myPyside6_QML/tree/main/basic08_one_fun_multi_signal
- gitee: https://gitee.com/wallace89/myPyside6_QML/tree/main/basic08_one_fun_multi_signal
一、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):# 定义两个信号signalA = Signal()signalB = Signal()def __init__(self):super().__init__()# 两个信号都连接到同一个槽函数self.signalA.connect(self.slot_handle_event)self.signalB.connect(self.slot_handle_event)# 统一的槽函数def slot_handle_event(self):print("[Python] 槽函数:收到一个信号事件")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.signalA.connect(self.slot_handle_event)
self.signalB.connect(self.slot_handle_event)
- 信号A与信号B都连接到同一个函数slot_handle_event();
二、Main.qml
import QtQuick
import QtQuick.ControlsWindow {width: 320height: 240visible: truetitle: "信号与槽 06 - 一个槽响应多个信号"Column {anchors.centerIn: parentspacing: 10Button {text: "触发信号A"onClicked: backend.signalA()}Button {text: "触发信号B"onClicked: backend.signalB()}}
}
关键点说明
Button {text: "触发信号A"onClicked: backend.signalA()
}Button {text: "触发信号B"onClicked: backend.signalB()
}
- 跟上一章节一样。QML可以很方便地调用信号函数。
- ButtonA通过点击按钮的回调直接调用信号函数signalA()。
- ButtonB一样。