首页 > 编程语言 >QML与python互相通信

QML与python互相通信

时间:2023-01-21 17:55:06浏览次数:43  
标签:__ name python 通信 state QML import

解决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)
        }
    }
}

标签:__,name,python,通信,state,QML,import
From: https://www.cnblogs.com/crossy/p/17063949.html

相关文章

  • 什么是 Python 中的装饰器?
    装饰器是Python中最强大的设计模式之一。装饰器用于向已创建的对象添加新功能,而无需修改其结构。使用装饰器,您可以轻松包装另一个函数以扩展包装的函数行为,并且无需永久修......
  • Python——01.环境及安装
    Python介绍--Python是解释型,面向对象的语言,程序结构简洁,清晰--Python解释器分类:CPython(官方解释器):用C语言编写的Python解释器PyPy:用Python语言编写的Python......
  • 用Python写一个模拟过年礼花的程序
    介绍过年了,好不容易熬到疫情放开,也该放烟花放鞭炮庆祝下了,祝大家新年快乐,身体健康,万事如意,希望新的一年诸邪退散,春暖花开~主程序importpygame,math,time,random,......
  • Python网络编程之微信机器人
    系统设计用Python实现了一个微信机器人,在微信公众号内发送消息,可以根据消息内容进行自动回复搭建Flask服务器,接收微信服务器发送的消息,并做出回复根据微信服务器发送过......
  • python赋值和拷贝
    赋值,值相同,内存地址相同–函数参数传递。浅拷贝,值相同,内存地址不同。拷贝第一层内存地址的引用。第一层元素为可变元素。拷贝过的引用会跟着发生变化。否则不发生变化import......
  • 【python】Matplotlib库学习笔记
    Matplotlib是python的绘图库。以下内容主要介绍Matplotlib的子库pyplot。pyplot是常用的2D绘图模块,包含一系列绘图相关函数。plot()函数plot()函数可以用来绘制......
  • 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据
    用conversionshellelement(S4R单元)建模层合板,有6层ply,每个lamina(ply)有3个integrationpoint,共计18个integrationpoint。我想得到集合SET-Middle-elem中所有integrati......
  • 安装 python in Linux: Ubuntu at WSL on windows
      安装ubuntu20.04appstore安装ubuntu安装异常:https://thegeekpage.com/wslregisterdistribution-failed-with-error-0x8007019e/    安装python3.8.1......
  • Python入门之数据类型转换
    """数据类型转换运算符算数运算符增强运算符"""#1.数据类型转换#intfloatstrstr_usb=input("请输入美元:")#类型转换str-->intin......
  • Python入门之数据类型
    """核心数据类型"""#1.Nonea01="张无忌"#接触变量与数据的绑定关系a01=None#使用None占位sex=None流程图:   #2.整形int#十进制nu......