导言


在这里插入图片描述
如上所示,这是一个最小的标准的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 QQmlApplicationEngine

class 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())

关键点说明

  1. Backend类
class Backend(QObject):
    @Slot()
    def print_something(self):
        print("hello,button")
  • 继承 QObject,才能作为 QML 与 Python 的桥梁。
  • @Slot() 是 Qt 的“插槽”标记,QML 才能调用。
  1. 注册后端到QML
engine.rootContext().setContextProperty("backend", backend)
  • 相当于告诉 QML:你在 QML 脚本里可以用 backend 这个对象。
  • 之后在 QML 的 onClicked 里直接写 backend.print_something()。

二、Main.qml


import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 400
    height: 300
    title: qsTr("Hello PySide6 + QML")

    Button {
        text: "Click Me"
        anchors.centerIn: parent
        onClicked: backend.print_something()
    }
}

关键点说明

Button {
    text: "Click Me"
    anchors.centerIn: parent
    onClicked: backend.on_button_clicked()
}
  • 当点击按钮时,就触发 Python 的 print_something 方法。

更多推荐