Pyside6 + QML - 信号与槽01 - Button 触发 Python 类方法
导言
如上所示,这是一个最小的标准的Pyside6 + QML前后端交互的框架。当用户点击GUI程序上的按钮时,运行一次Backend.print_something()函数。效果如下所示:
工程代码:
- github:https://github.com/q164129345/myPyside6_QML/tree/main/basic02_button_slot
- gitee:https://gitee.com/wallace89/myPyside6_QML/tree/main/basic02_button_slot
一、main.py
import sys
from PySide6.QtCore import QObject, Slot
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngineclass Backend(QObject):@Slot()def print_something(self):print("hello,button")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())
关键点说明
- Backend类
class Backend(QObject):@Slot()def print_something(self):print("hello,button")
- 继承
QObject
,才能作为 QML 与 Python 的桥梁。 @Slot()
是 Qt 的“插槽”标记,QML 才能调用。
- 注册后端到QML
engine.rootContext().setContextProperty("backend", backend)
- 相当于告诉 QML:你在 QML 脚本里可以用 backend 这个对象。
- 之后在 QML 的 onClicked 里直接写 backend.print_something()。
二、Main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 300title: qsTr("Hello PySide6 + QML")Button {text: "Click Me"anchors.centerIn: parentonClicked: backend.print_something()}
}
关键点说明
Button {text: "Click Me"anchors.centerIn: parentonClicked: backend.on_button_clicked()
}
- 当点击按钮时,就触发 Python 的 print_something 方法。