QML 与 Python 交互
在 Qt 中,C++ 和 QML 交互一般有如下三种方法
- 上下文属性:setContextProperty( )
- 向引擎注册类型:调用 qmlRegisterType( )
- QML 扩展插件:虽然有很大的灵活性,但是用 Python 创建 QML 插件比较麻烦,所以这种方法不适用于 Python
将 Python 代码暴露给 QML:上下文属性
import random
import sys
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import QUrl, QObject, Signal, Slotclass NumberGenerator(QObject):def __init__(self):QObject.__init__(self)nextNumber = Signal(int, arguments=['number'])@Slot()def giveNumber(self):self.nextNumber.emit(random.randint(0, 99))if __name__ == "__main__":app = QGuiApplication(sys.argv)engine = QQmlApplicationEngine()number_generator = NumberGenerator()engine.rootContext().setContextProperty('numberGenerator', number_generator)engine.load(QUrl("main.qml"))if not engine.rootObjects():sys.exit(-1)sys.exit(app.exec())
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.14Window {id: root width: 640height: 480visible: true title: qsTr("Hello World")Flow {Button {text: qsTr("Give me a number")onClicked: numberGenerator.giveNumber()}Label {id: numberLabeltext: qsTr("no number")}}Connections {target:numberGeneratorfunction onNextNumber(number) {numberLabel.text = number}}}
上述代码要结合 .py
文件进行理解,onClicked(发射 clicked 信号)会触发槽函数 numberGenerator.giveNumber(),该函数会发射 numberGenerator.nextNumber 信号,这个信号又被 QML 中的 onNextNumber 捕获,并修改 label 的显示结果。
.py
文件使用 setContextProperty() 函数 把 Python 对象 number_generator 暴露给 QML (对应 QML 中的 numberGenerator),这种方式会直接添加到 QML 的上下文环境中,在QML 中可以直接使用,不需要重新导入,使用方便,但容易导致命名冲突。
这里使用 Slot 装饰符将 giveNumber() 变成槽函数,不然无法使用
将 Python 对象暴露给 QML :注册类型
// #region global
import QtQuick
import QtQuick.Window
import QtQuick.Controlsimport GeneratorsWindow {id: rootwidth: 640height: 480visible: truetitle: qsTr("Hello Python World!")Flow {Button {text: qsTr("Give me a number!")onClicked: numberGenerator.giveNumber()}Label {id: numberLabeltext: qsTr("no number")}}NumberGenerator {id: numberGenerator}Connections {target: numberGeneratorfunction onNextNumber(number) {numberLabel.text = number}}
}
// #endregion global
#region global
import random
import sysfrom PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
from PySide6.QtCore import QUrl, QObject, Signal, Slotclass NumberGenerator(QObject):def __init__(self):QObject.__init__(self)nextNumber = Signal(int, arguments=['number'])@Slot()def giveNumber(self):self.nextNumber.emit(random.randint(0, 99))if __name__ == '__main__':app = QGuiApplication(sys.argv)engine = QQmlApplicationEngine()qmlRegisterType(NumberGenerator, 'Generators', 1, 0, 'NumberGenerator')# engine.load(QUrl("main.qml"))import ospath = os.path.dirname(__file__) + os.sep + 'main.qml'engine.load(path)if not engine.rootObjects():sys.exit(-1) sys.exit(app.exec())
#endregion global
main.qml 文件中需要导入 Python 注册的模块 Generators,并将类实例化为 NumberGenerator{…},该实例就可以向任何其他 QML 元素一样工作。
qmlRegisterType( ) 函数
把 Python 对象暴露给 QML ,主要使用 qmlRegisterType()
函数。qmlRegisterType( ) 函数来自于 PySide6.QtQml 模块并接收5个参数:
qmlRegisterType (pytype: type, uri: str, versionMajor: int, versionMinor: int, qmlName: str**)**
参数:
- pytype (type) – Python 类(py文件中的类名)
- uri (str) – 表示对类的引用,如本案例的 Generator(QML中 import 的名称)
- versionMajor (int) – 主要版本编号,如本案例中的 1
- versionMinor (int) – 次要版本编号,如本案例中的 0
- qmlName (str) – 暴露给QML的类名称,本案例中的 NumberGenerator
返回类型:int (the QML type id)
相互关系如下图所示:
在 QML 中调用 Python 属性的方法
这是一种常用的方法,先介绍 Python 中的 Property( ) 函数——property() 函数的作用是在新式类中返回属性值。
class property([fget[, fset[, fdel[, doc]]]])
参数
- fget – 获取属性值的函数
- fset – 设置属性值的函数
- fdel – 删除属性值函数
- doc – 属性描述信息
返回值: 返回新式类属性。
举例如下:
class C (object):def __init__(self):self._x = Nonedef getx(self):return self._xdef setx(self, value):self._x = valuedef delx(self):del self._xx = property(getx, setx, delx, "I am the 'x' property.")
如果 c = C( ),则 c.x 将触发 getter 信号, c.x = value 将触发 setter 信号,del c.x 将触发 deleter 信号。
参照 Python 中的 Property( ) 函数,Qt 中不仅提供了自己的属性,还提供了信号和槽的支持。由此可以理解,以下代码的几个参数分别表示类型,已及 getter 信号、setter 信号和通知信号(当属性改变时需要发出该信号,通知属性的变化):
from PySide6.QtCore import Property
maxNumber = Property(int, get_max_number, set_max_number, notify = maxNumberChanged)
之所以绕一圈进行修改,是因为在 QML 中直接通过 JavaScript 更改属性会破坏与属性的绑定,而通过显示使用 setter( ) 函数可以避免这种情况。
参考
相关文章:

QML 与 Python 交互
在 Qt 中,C 和 QML 交互一般有如下三种方法 上下文属性:setContextProperty( )向引擎注册类型:调用 qmlRegisterType( )QML 扩展插件:虽然有很大的灵活性,但是用 Python 创建 QML 插件比较麻烦,所以这种方法…...

React基础教程(三):JSX语法
React基础教程(三):JSX语法 1、JSX简介 全称:JavaScript XMLreact定义的一种类似于XML的JS扩展语法:JSXML本质是React.createElement(component, props, ...children)方法的语法糖作用:用来简化创建虚拟DOM(注意&…...

软件测试岗位都是女孩子在做吗?
听我一朋友说,测试岗位基本都是女孩子做。” 不知道是不是以前“软件测试岗”给人印象是“不需要太多技术含量”的错觉,从而大部分外行认为从业软件测试的人员中女生应占了大多数。比如有人就觉得:软件测试主要是细心活,所以女生…...

ARP协议,带你了解ARP协议
目录 一、ARP协议概述 二、使用ARP的四种情况 三、ARP缓存 四、ARP的工作原理 1. 地址解析 2. 地址缓存 五、ARP报文格式 1. ARP请求报文格式 2. ARP响应报文格式 六、免费ARP 七、代理ARP 一、ARP协议概述 ARP(Address Resolution Protocol)地…...

基于Java汽车客运站管理系统设计实现(源码+lw+部署文档+讲解等)
博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…...
0203使用规则-索引-MySQL
文章目录 1 联合索引1.1 最左前缀法则1.2 范围查询 2 索引失效2.1 常见情况2.2 数据分布影响 3 SQL提示4 覆盖索引和回表查询5 前缀索引6 单列和联合索引7 设计原则结语 1 联合索引 1.1 最左前缀法则 在Mysql数据库中创建了联合索引(或称复合索引,即包含…...

LVS+Keepalived群集
一、Keepalived概述 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,…...

抖音矩阵系统源代码开发部署--源码搭建
抖音矩阵系统是一个具有强大功能的开放性平台,通过数据挖掘技术能够实现精准的用户画像和个性化推荐,这也是抖音成为国内最受欢迎的短视频平台之一的原因之一。矩阵系统的开发需要大量的技术支持和数据分析,同时也需要综合运用大数据、机器学…...

如何用Jmeter进行接口测试 ,这应该是全网最详细的教程了
一、Jmeter 的使用步骤 打开Jmeter 安装包,进入\bin 中,找到"jmeter.bat", 点击打开即可。 在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线…...

C语言---malloc(0)会产生什么结果,真的是空指针吗?
前言 (1)几天前在一个交流群中看到有人说,面试问malloc(0)会怎么样是真的恶心。 (2)这个突然激起了我的好奇心。居然还可以malloc(0)?! (3)经过测试最后,发现…...

建模助手618 | 谁不囤点Revit插件我都会生气!
大家好,这里是建模助手。 早在5月份,我们已经就“618”这个事情高调了一番,以提前放“价”的姿势,让许多用户以躺赢的状态拉开了年中大促的序幕。(5月购买的盆友,切记看完全文,内附彩蛋 活动反…...
【“职场程序员是否会保护自己的隐私?为何要求程序员之间保密薪资?”】
职场程序员之间确实有一些秘密,其中之一便是对薪资保密。这并非完全是程序员们的独立行为,而是因为一些公司或组织规定员工之间不能互相透露薪水信息。 第一个原因是保护公司自身利益。如果一个程序员知道其他同事的薪资水平比自己高,他可能…...

企业工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...

创新指南 | 推动销售的17个可落地的集客式营销示例
无论您是开启集客式的营销有一段时间还是处于起步阶段,了解像您这样的企业是如何粉碎竞争对手的的集客式策略总是有帮助的。无论您的公司做什么,它所服务的行业,是B2B还是B2C ,您都可以在这里找到许多可以使用的示例。 在本文中&…...

ASEMI代理光宝光耦LTV-0314的应用与优势
编辑-Z 在电子设备的设计和制造过程中,光耦合器是一种至关重要的组件。它们在电路中起到隔离作用,保护电子设备免受电压冲击和电流过载的影响。今天,我们将深入探讨一种特殊的光耦合器——LTV-0314,它的特性、应用以及优势。 一、…...

Apikit 自学日记: Apikit 如何发起测试
进入 API 文档详情页,点击上方 测试 标签,进入 API 测试页,系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value ,…...
python-glob模块_表格及代码样例
glob模块 文章目录 glob模块1. glob.glob(pathname):根据指定的模式匹配文件路径,并返回匹配的路径列表2. glob.iglob(pathname):返回一个迭代器,逐个匹配文件路径,适用于大量文件的情况3. glob.escape(pathname)&…...

GitHub Copilot 最全安装、使用
GitHub Copilot 最全安装、使用教程 一、温馨提示 GitHub Copilot 目前为止可以免费试用一个月,但是试用的前提是必须要绑定银行卡,因为后续会自动扣费,所以请注意试用结束日期,自己定好闹钟关闭订阅。 订阅价格为每月10美刀&a…...

C语言 指针(特别篇)
本篇目录 C语言 指针(特别篇)内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &(Address-of Operator)C语言中的 * 号运算符示例集:指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…...

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)
文章目录 一、检测相关(9篇)1.1 Energy-based Detection of Adverse Weather Effects in LiDAR Data1.2 Anomaly Detection with Conditioned Denoising Diffusion Models1.3 Mask Attack Detection Using Vascular-weighted Motion-robust rPPG Signals1.4 Improved Multi-Sca…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...