Pyside6 + QML - 信号与槽08 - 一个函数被多个信号触发(带参数)
导言
在上一章节的基础上携带“参数”。不仅区分是 信号 A / 信号 B,还在信号里携带 点击次数。这样 QML 按钮每次点击,Python 既能知道“是谁”,也能知道“第几次”。
效果如下:
工程代码:
- github: https://github.com/q164129345/myPyside6_QML/tree/main/basic09_one_fun_multi_signal_with_para
- gitee: https://gitee.com/wallace89/myPyside6_QML/tree/main/basic09_one_fun_multi_signal_with_para
一、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(str, int)signalB = Signal(str, int)def __init__(self):super().__init__()self.signalA.connect(self.slot_handle_event)self.signalB.connect(self.slot_handle_event)# 统一的函数,接收 (来源, 次数) 参数def slot_handle_event(self, source: str, count: int):print(f"[Python] 槽函数:收到来自信号 {source} 的事件,第 {count} 次点击")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())
关键点说明
# 定义两个信号,带 (来源, 次数) 参数
signalA = Signal(str, int)
signalB = Signal(str, int)# 统一的函数,接收 (来源, 次数) 参数
def slot_handle_event(self, source: str, count: int):print(f"[Python] 槽函数:收到来自信号 {source} 的事件,第 {count} 次点击")
- 入口参数的个数与类型一定要对应上。
二、Main.qml
import QtQuick
import QtQuick.ControlsWindow {width: 320height: 240visible: truetitle: "信号与槽 06 - 一个槽响应多个信号"// 定义 countA 和 countB 属性,进行累加操作property int countA: 0property int countB: 0Column {anchors.centerIn: parentspacing: 10Button {text: "触发信号A"onClicked: {countA += 1 // 在 QML 中进行累加backend.signalA("A", countA) // 发射信号并传递参数}}Button {text: "触发信号B"onClicked: {countB += 1 // 在 QML 中进行累加backend.signalB("B", countB) // 发射信号并传递参数}}}
}
关键点说明
Button {text: "触发信号A"onClicked: {countA += 1 // 在 QML 中进行累加backend.signalA("A", countA) // 发射信号并传递参数}
}Button {text: "触发信号B"onClicked: {countB += 1 // 在 QML 中进行累加backend.signalB("B", countB) // 发射信号并传递参数}
}
- 同理,QML侧调用信号函数时,入口参数的数量与类型一定要对应上。