新闻详情

新闻详情

首页 / 资讯中心 / 详情

9.qml-property自定义属性、传递属性给C++使用

发布时间:2026/10/1 9:28:35来源:尧图网络
9.qml-property自定义属性、传递属性给C++使用
1.property介绍property用来自定义一个属性,并且可以进行初始化,且没有public、private、protected等限制.property定义属性的类型可以是QML基本类型、也可以是QML对象类型,也可以是var泛型类型,而基本类型支持的有bool、double、int、list、real、string、url类型自定义的属性默认会有个属性值改变信号,可以通过onPropertyChanged信号处理器来接受该信号。示例如下所示:Window{ visible: true property int cnt // 未初始化,cnt默认为0 property string label: cnt // 进行初始化 label cnt Component.onCompleted: { console.log(label,cnt); cnt; label count; } onLabelChanged: { console.log(onLabelChanged:label) } onCntChanged: { console.log(onCntChanged:cnt) } }运行打印:qml: cnt,0 qml: onCntChanged:1 qml: onLabelChanged:count2.基本类型数组属性自定义基本类型数组属性自定义,则使用var泛型类型即可,示例如下所示:Window{ visible: true property var strList : [ str1, str2, str3 ] Component.onCompleted: { console.log(strList.length); for(var index in strList) { console.log(index: strList[index]) } } }如果我们要创建一个空数组,那么直接初始化赋值为[]即可,比如:property var objArr: []如果我们想定义二维数组,比如;property var rotationModel: [ [#00FF00, RotationAnimation.Numerical, 12], [#FF0000, RotationAnimation.Clockwise, 12], [#0000FF, RotationAnimation.Counterclockwise, 12], [#00FFFF, RotationAnimation.Shortest, 12], ] MouseArea { id: area anchors.fill: parent onPressed: { console.log(rotationModel.length,rotationModel[0].length) // 打印4,3 表示有4行,每行里面有3列 } }3. QML对象数组属性自定义如果自定义一组对象数组,则使用listObject类型,示例如下所示:Window{ visible: true property listRectangle rectList : [ Rectangle{ id: list1; color:#FF0000 }, Rectangle{ id: list2; color:#FFFF00}, Rectangle{ id: list3; color:#FFFFFF} ] Component.onCompleted: { console.log(rectList.length); for(var index in rectList) { console.log(index: rectList[index].color) } } }如果用var去存储QML对象数组,将会报错,因为var类型接受的array数组只能是基本类型,而Rectangle是个对象.4.只读属性自定义只读属性必须初始化且不能修改只需要在property前面加上readonly即可.比如:readonly property string type: readonly5.QML传递数组给C首先看下面图所示:Qt TypeJavaScript TypeQVariantListArrayQVariantMapObjectQDateTime, QTimeDateQByteArrayarrayBuffer我们以QML-Array为例,示例如下所示,在QML中,通过Array这样写:Component.onCompleted: { var arr [true, false, true, true, false, false, false, true, true, false]; xx.test(arr); // 调用c中的test()函数 }然后在c类,定义如下所示:Q_INVOKABLE void test(QVariantList list);然后实现如下所示:void Xxxx::test(QVariantList list) { qDebug()test:list.length(); for (int i 0; i list.length(); i) { qDebug()for:ilist[i]; } }6.QML传递函数对象给C进行回调qml函数对象 对于Qt C类而言是QJSValue对象。QJSValue对象就是qml的Object对象也可以是string、bool、函数对象等等构造函数如下所示:如果QJSValue对象是函数的话需要通过QJSValue::isCallable()判断是否可以执行然后再去调用QJSValue QJSValue::call(const QJSValueList args QJSValueList())进行执行函数参数列表就是对应qml的函数参数。比如我们注册一个C 类叫Backend。然后QML执行:Button { onClicked: { Backend.testCall(function(result, value) { console.log(匿名回调被触发结果:, JSON.stringify(result,null,4), value) }) } }然后在Backend C类定义一个函数:Q_INVOKABLE void testCall(QJSValue callback);实现如下所示:void Backend::testCall(QJSValue callback) { QJSEngine *engine qjsEngine(this); if (!engine) { qWarning() 无法获取 QJSEngine 实例; return; } if(callback.isCallable()) { QVariantMap data; data[status] success; data[value] 42; QJSValue jsData engine-toScriptValue(data); QJSValueList args; args jsData QJSValue(15); // 参数传递一个js对象、数值对象 callback.call(args); } }点击按钮后会打印:
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

链表中间结点查找:快慢指针原理与代码实现全解析 2026/10/1 11:09:56

链表中间结点查找:快慢指针原理与代码实现全解析

链表相关的算法题里,找到链表的中间结点绝对是一道绕不开的入门题。不管你是刚开始刷 LeetCode、准备数据结构期末考试,还是面试前临时抱佛脚,这道题出现的频率都高得吓人。它的经典解法快慢指针,更是后续许多链表高级技巧的基石。…

阅读更多 →
安卓APK反编译与Smali修改实战指南 2026/10/1 11:09:56

安卓APK反编译与Smali修改实战指南

1. 这不是“破解”,而是安卓应用的深度理解入口你手头有个APK,想改掉启动页的广告、删掉某个没用的功能按钮、把深色主题换成自己设计的渐变紫,甚至想看看某款工具类App的算法逻辑——但打开Android Studio新建项目重写?成本太高&…

阅读更多 →
实时数据驱动的网红营销:从过程监控到策略调整 2026/10/1 11:09:56

实时数据驱动的网红营销:从过程监控到策略调整

做网红营销这几年,我最大的一个感触是:钱投出去以后,最怕的不是数据不好看,而是你等到活动结束才知道哪里出了问题。以前做一轮推广,经常要等供应商的结案报告,几十页PPT翻到最后,才发现那位“看…

阅读更多 →
学习率调度实战:从Warmup到余弦退火的训练节奏控制 2026/10/1 11:09:55

学习率调度实战:从Warmup到余弦退火的训练节奏控制

1. 从玄学到工程:为什么说学习率调度是训练节奏的指挥棒搞深度学习这些年,我越来越觉得训练模型这事儿像炖汤。数据是食材,模型结构是锅,优化器是火候,而学习率调度,就是那个决定什么时候大火煮沸、什么时候…

阅读更多 →
C++单例模式的正确实现:从线程安全到生命周期管控 2026/10/1 11:09:49

C++单例模式的正确实现:从线程安全到生命周期管控

1. 单例模式不是“写个全局变量”那么简单:它解决的是资源唯一性与生命周期控制的双重难题 很多人刚接触单例模式时,第一反应是:“不就是定义一个全局变量,再加个静态函数返回它吗?”——这恰恰是踩进第一个认知陷阱的…

阅读更多 →
Node-RED低代码可视化:MQTT+MySQL+HTML构建实时数据看板 2026/10/1 11:09:49

Node-RED低代码可视化:MQTT+MySQL+HTML构建实时数据看板

1. 项目概述:为什么“拖拽可视化”正在成为数据展示的分水岭你有没有遇到过这样的场景:业务部门凌晨发来一张Excel表格,要求两小时内把销售趋势做成带交互的网页图表;IoT团队刚调试完温湿度传感器,需要立刻把实时数据流…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉