QML与python互相通信

解决python与QML的通信问题:

  1. QML中直接调用python函数
  2. python发送信号,QML响应信号并进行相应处理

py文件

# This Python file uses the following encoding: utf-8
import sys
from pathlib import Path

from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import QObject, Slot, Signal
import time


# 定义一个类,将我们需要用到的方法、变量等都放到里面,便于调用
class myClass(QObject):
    # sig = Signal(str, float, arguments=['name', 'value'])
    sig = Signal(str, float) # str,float 为信号传递的参数类型,  name,value 为QMl中使用它们时的名字, 也可以不写

    def __init__(self):
        super(myClass, self).__init__()

    @Slot(str, result=int) # str 为say_hello的参数类型, result=int 表示QML接收的返回值为int类型
    def say_hello(self, name):
        print('hello,' + name)
        return 999

    @Slot()  # 不需要接收输入参数,也不返回参数
    def test(self):
        time.sleep(1) # 模拟 do something
        self.sig.emit('orange', 9.99)
        print('信号已发出')


if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    qml_file = Path(__file__).resolve().parent / "main.qml"
#################################################
    # 实例化一个类,然后把它添加到QML文件的上下文中
    x = myClass()
    engine.rootContext().setContextProperty('pymyClass', x) # pymyClass 为在qml中调用时使用的名字,可以随便起
    engine.load(qml_file)
#################################################
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec())

QML文件

import QtQuick
import QtQuick.Window
import QtQuick.Controls

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    property int state: 0

    Button {
        id: buton1
        text: "button_hello"
        width: 100
        height: 60
        x: 100
        y: 100
        onClicked: {
            state = pymyClass.say_hello("apple")
            console.log('state: ' + state) // 使用 state 获取python函数的返回值
        }
    }

    Button {
        id: buton2
        text: "button_test"
        width: 100
        height: 60
        x: 400
        y: 200
        onClicked: {
            console.log('发射信号') // 使用 state 获取python函数的返回值
            pymyClass.test()
        }
    }

    Connections {
        target: pymyClass // 绑定python的类
        ignoreUnknownSignals: true // 取消警告
        function onSig(name, value) { // 使用 on + 信号名(首字母大写) 作为信号的槽
            console.log('收到信号, name:', name, ', value:', value)
        }
    }
}
posted @ 2023-01-21 17:48  暮鼓晨钟·  阅读(1314)  评论(0编辑  收藏  举报