【QT Quick】C++交互:QML对象操作

本节课程将详细讲解如何通过 C++ 代码访问并操作 QML 对象。通常来说,我们的需求是访问 QML 的属性和信号,而避免直接修改 QML,因为这样做会改变业务逻辑。

查找 QML 对象

在 Qt Quick 中,我们可以通过 C++ 代码与 QML 对象进行交互,访问它们的属性和调用它们的方法。为了实现这种交互,我们需要先通过 QML 的上下文对象找到我们要操作的 QML 对象。然后,使用 QObject 提供的接口来遍历节点或操作对象的属性。

  1. 首先获取 QML 的根节点。
  2. 使用 findChild<T>() 方法查找特定子节点。
QObject* rootObject = engine.rootObjects().first(); // 获取 QML 根对象
QObject* textObject = rootObject->findChild<QObject*>("myTXT"); // 查找 ID 为 myTXT 的节点if (textObject) {qDebug() << "找到对象:" << textObject->objectName();
} else {qDebug() << "未找到指定的对象。";
}

在 QML 中,通过设置对象的 objectName 属性来指定节点的名称,例如:

Text {id: myTXTobjectName: "myTXT"text: "Hello, Qt Quick!"
}

遍历所有子节点

遍历 QML 中的所有子节点通常用于查看整个 QML 树结构,或者需要对所有组件进行统一处理。

为了遍历整个 QML 树结构,我们可以使用 QObject 类的 children() 方法获取对象的所有子节点,然后递归地访问每一个子节点,直到遍历完整个树结构。

下面是一个遍历 QML 对象树的代码示例:

void PrintQmlObj(QObject* obj, int level = 0) {if (!obj) return;// 获取所有的子对象auto subs = obj->children();// 设置层级前缀,用于显示树状结构QString head = "";for (int i = 0; i < level; i++) {head += "-";}// 遍历子对象for (auto s : subs) {QString str = head;str += "className: ";str += s->metaObject()->className();  // 获取对象类名str += " ";// 访问属性并添加到输出字符串中str += "width: ";str += s->property("width").toString();  // 尝试读取宽度属性str += " height: ";str += s->property("height").toString();  // 尝试读取高度属性// 打印对象信息qDebug() << str;// 如果子节点还有自己的子节点,递归遍历if (!s->children().empty()) {PrintQmlObj(s, level + 1);}}
}
  • void PrintQmlObj(QObject* obj, int level = 0):
    • obj 为当前对象的指针,level 用于表示遍历的层次。
    • 如果 objnullptr,直接返回。
  • auto subs = obj->children();:
    • 获取当前对象的所有子对象。
  • QString head = ""; for (int i = 0; i < level; i++) { head += "-"; }:
    • 根据层次深度创建一个字符串前缀,以便打印输出时显示层次结构。
  • str += s->metaObject()->className();:
    • 使用 metaObject() 获取子对象的元信息,从中获取类名。
  • str += s->property("width").toString();:
    • 使用 property() 获取对象的属性值。这里尝试读取 widthheight 属性。
  • qDebug() << str;:
    • 输出对象的信息,包括层级、类名和属性值。
  • if (!s->children().empty()) { PrintQmlObj(s, level + 1); }:
    • 如果当前对象还有子节点,则递归调用 PrintQmlObj,继续遍历。

读取 QML 对象的属性

可以通过 property() 方法来读取 QML 对象的属性:

if (textObject) {QVariant width = textObject->property("width");if (width.isValid()) {int widthValue = width.toInt();qDebug() << "宽度为:" << widthValue;}
}

property() 方法返回 QVariant 类型的值,可以通过 toInt()toString() 等方法将其转换为相应类型。

修改 QML 对象的属性

可以通过 setProperty() 方法来修改 QML 对象的属性:

if (textObject) {textObject->setProperty("text", "Changed by C++");qDebug() << "Text 属性已修改。";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用&#xff0c;不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面&#xff1a; 安全性: 内部API通常不对外部用户公开&#xff0c;这样可以防止…

Linux操作系统——概念扫盲I

目录 虚拟机概念刨析 在那之前&#xff0c;询问什么是虚拟化&#xff1f; 现在来看看什么是虚拟机 虚拟机有啥好的 小差&#xff1a;那JVM也叫Java Virtual Machine&#xff0c;有啥区别呢&#xff1f; Reference 虚拟机概念刨析 我们下面来简单聊聊虚拟机这个概念。对于…

嵌入式硬件设计

嵌入式硬件设计是指针对嵌入式系统&#xff08;一种专用的计算机系统&#xff0c;通常嵌入到其他设备中&#xff09;进行的硬件设计工作。嵌入式系统广泛应用于消费电子、工业控制、医疗设备、汽车电子、航空航天等领域。以下是嵌入式硬件设计的主要内容和步骤&#xff1a; 1.…

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网)

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网&#xff09; 思维导图汇总深度优先搜索理论基础98.所有可达路径(卡码网)1.邻接矩阵法2.邻接表法 思维导图汇总 深度优先搜索理论基础 深度优先搜索&#xff08;dfs&#xff09;与广度优先搜索&#xff08;bfs&#xf…

QSerialPort 串口通信示例

之前使用过MFC写过串口通信的示例&#xff0c;今年学了Qt&#xff0c;特意使用Qt写了串口通信的示例&#xff0c;发现比MFC要容易一些&#xff0c; MFC串口示例如下&#xff1a; Qt示例如下&#xff1a; Qt这个做的很简单&#xff0c;主要还是想验证一下api&#xff0c; 核心…

Python中对象obj类型确定最pythonic的方式——isinstance()函数

python中确定对象obj的类型&#xff0c;isinstance函数最是优雅&#xff0c;type、issubclass等函数也可以&#xff0c;但终究“曲折”。 (笔记模板由python脚本于2024年10月07日 19:42:38创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…

算法专题四: 前缀和

目录 1. 前缀和2. 二维前缀和3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为k的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 博客主页:酷酷学!!! 感谢关注~ 1. 前缀和 算法思路: 根据题意, 创建一个前缀和数组, dp[i] dp[i -1] arr[i], 再使用前缀和数组,…

排查和解决JVM OOM实战

JVM OOM介绍 Java内存区域布局 下面的分析中都是基于JDK 8开始的。关于JMM不过多介绍每个区域的作用。OOM不单只会发生在堆内存&#xff0c;也可能是因为元空间或直接内存泄漏导致OOM&#xff0c;此时在OOM的详细信息中会有不同体现。 Java OOM的类别 java.lang.OutOfMemory…

王者农药更新版

一、启动文件配置 二、GPIO使用 2.1基本步骤 1.配置GPIO&#xff0c;所以RCC开启APB2时钟 2.GPIO初始化&#xff08;结构体&#xff09; 3.给GPIO引脚设置高/低电平&#xff08;WriteBit&#xff09; 2.2Led循环点亮&#xff08;GPIO输出&#xff09; 1.RCC开启APB2时钟。…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

TIM(Timer)定时器的原理

一、介绍 硬件定时器的工作原理基于时钟信号源提供稳定的时钟信号作为计时器的基准。计数器从预设值开始计数&#xff0c;每当时钟信号到达时计数器递增。当计数器达到预设值时&#xff0c;定时器会触发一个中断信号通知中断控制器处理相应的中断服务程序。在中断服务程序中&a…

LeetCode讲解篇之239. 滑动窗口最大值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们维护一个长度为k的窗口&#xff0c;然后窗口从数组最左边一直移动到最右边&#xff0c;记录过程中窗口中的最大值&#xff0c;就是答案 我们每次查询长度为k的窗口最大值是什么时间复杂度是O(k)的&#xff0…

rust中async/await的使用

在Rust中,async/await 用于编写异步代码。它允许您以同步的方式编写异步代码,使得异步操作更易于理解和编写。 安装依赖: cargo add futures cargo add async-std 使用示例: 示例1: use async_std::task::block_on;fn main() {block_on(hello()); }async fn hello() …

MoveIt2-humble----Planning Around Objects

1 添加Planning Scene Interface头文件 #include <moveit/planning_scene_interface/planning_scene_interface.h>2 改变目标位姿 // Set a target Pose auto const target_pose [] {geometry_msgs::msg::Pose msg;msg.orientation.w 1.0;msg.position.x 0.28;msg.p…

Github 2024-10-06 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

Linux安装部署MySQL8.0加遇着问题解决

1.首先我先给个URL下载MySQL官方网站https://downloads.mysql.com/archives/community/ 2.选择Linux的红帽系统 3.接着选择红帽系统的7版本,x86 4.接着选择MySQL版本,此时我选择8.4.0,下载rpm bundle这个,下载下面这个就好 5.Windows文件上传到Linux系统 rz上传文件命令,找到…

【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度

前言 前置知识&#xff1a;设置参数后&#xff0c;下一个循环才会切换对应动画&#xff0c;所以在下一个循环获取真实的动画长度 AnimatorStateInfo是结构体&#xff01;值类型&#xff0c;要不断重复获取才是最新的 主要是自动设置trigger切换的动画自动切回上一个动画&#x…

Java中如何实现定时任务?

目录 一、定时任务 概念 作用 二、简单定时任务实现方式 1. Thread线程等待&#xff08;最原始最简单方式&#xff09; 2. 使用java.util.Timer Timer 优缺点分析 3. 使用JDK自带的ScheduledExecutorService schedule和scheduleAtFixedRate的区别 schedule侧重保持间隔…