QML与C++交互的两种注册方法比较(rootContext 和 qmlRegisterType)

在main.cpp实例化对象调用的过程中,注册是常见的操作之一,目前接触到的方法有两种,两者的目的和使用方式是不同的,通过代码可以直观的
看出来

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;//注册方法1engine.rootContext()->setContextProperty("MyListModel", MyListModel::getInstance());//注册方法2qmlRegisterType<MyListModel>("ListMod", 1, 0, "MyListModel");const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

qmlRegisterType

qmlRegisterType 是一个函数,用于在 QML 引擎中注册 C++ 类型,使得 QML 文件中可以直接使用这些类型。这个函数通常在 C++ 代码中调用,用于将自定义的 C++ 类(特别是那些继承自 QObject 的类)暴露给 QML。

  • 优点:
    • QML 文件中可以直接使用注册的类型,创建其实例,并与其进行交互。
    • 支持类型安全,QML 编辑器(如 Qt Creator)可以提供自动补全和类型检查。
    • 适用于需要多个实例的情况,因为 QML 可以直接创建和管理这些实例。
  • 缺点:
    • 需要 C++ 类与 QML 之间进行明确的类型匹配。
    • 如果类具有复杂的构造函数或需要特定的初始化逻辑,可能需要额外的设置。

在给出的例子中:

qmlRegisterType<MyListModel>("ListMod", 1, 0, "MyListModel");

这里注册了一个名为 MyListModel 的 C++ 类,它在 QML 中的导入模块为 “ListMod”,版本为 1.0,并且可以直接在 QML 中通过 MyListModel 类型名来创建和使用实例。

setContextProperty

setContextProperty 是一个方法,用于将 C++ 对象或值设置为 QML 上下文的属性,这样 QML 文件中就可以通过属性名直接访问它。这通常用于将单例或全局对象暴露给 QML。

  • 优点:
    • 简单直接,适用于将单例或全局对象暴露给 QML。
    • 不需要复杂的类型匹配或注册。
  • 缺点:
    • 不支持类型安全,QML 编辑器可能无法提供自动补全或类型检查。
    • 只能在 QML 文件中访问一个特定的实例(通常是单例)。

在给出的例子中:

engine.rootContext()->setContextProperty("MyListModel", MyListModel::getInstance());

这里将 MyListModel 的单例实例设置为 QML 上下文的属性,名为 “MyListModel”。在 QML 文件中,可以直接通过 MyListModel 这个属性名来访问这个单例实例。

风险验证

//cpp
QScreen *screen = QGuiApplication::primaryScreen();
engine.rootContext()->setContextProperty("screen_WIDTH",800);
//qml
property int screen_width: 200
width: screen_WIDTH

此时的宽度是800还是200呢?是200

总结

  • qmlRegisterType 用于注册 C++ 类型,以便 QML 可以直接创建和使用这些类型的实例。
  • setContextProperty 用于将 C++ 对象或值设置为 QML 上下文的属性,以便 QML 可以直接访问它们。这通常用于单例或全局对象。
  • 不建议使用setContextProperty ,因为当全局和局部遇到重名时,会直接覆盖掉,这对于程序来说是非常危险的。
  • 性能方面qmlRegisterType 会稍好一点

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

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

相关文章

软件安全复习

文章目录 第一章 软件安全概述1.1 信息定义1.2 信息的属性1.3 信息安全1.4 软件安全1.5 软件安全威胁及其来源1.5.1 软件缺陷与漏洞1.5.1.1 软件缺陷1.5.1.2 漏洞1.5.1.3 软件漏洞1.5.1.4 软件缺陷和漏洞的威胁 1.5.2 恶意软件1.5.2.1 恶意软件的定义1.5.2.2 恶意软件的威胁 1.…

携手AI,如何共赢未来?

5/25日参加了一个培训分享会&#xff0c;由博奥研究院、武汉博奕咨询和华工科技联合举办&#xff0c;主题是“携手Ai&#xff0c;共赢未来”。 抱着跟书友线下交流的心态我参与了&#xff0c;参与前我对博奥做了基础了解&#xff0c;他们跟工信部考试和教育中心有合作&#x…

【C语言】指针作为参数(传值调用vs传址调用)

前言 在前面讲了那些指针相关的内容后&#xff0c;是时候探讨一下指针有什么作用了。 在C语言中&#xff0c;指针有多种各不相同的应用&#xff0c;在本篇文章中&#xff0c;我们探讨一下指针作为函数参数的作用&#xff08;对比传值与传址两种不同函数调用方式&#xff09;。…

【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、耐用指数)

文章目录 一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem 二、山体阴影 方法一:符号系统 利用符号系统中的山体阴影,渲染出阴影效果。 方法二:山体阴影工具 该算法计算输入中的数字化地形模型的山体阴影。根据太阳的位…

2024 年 5 个 GO REST API 框架

什么是API&#xff1f; API是一个软件解决方案&#xff0c;作为中介&#xff0c;使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值&#xff1a; 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码&#xff1b;这些是为移动开…

kali下载zsteg和stegpy

1.kali下载zsteg 从 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切换目录 cd zsteg 用于安装名为 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下载stegpy 下载网站内的stegpy-master压缩包GitCode - 开发者的代码家园 并拉到kali中 切换到s…

python数据分析——数据可视化(图形绘制)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制scatter()示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线…

Sql Sever删除数据库时提示数据库正在被使用,解决办法

报错解释&#xff1a; 当您尝试删除SQL Server中的某个对象&#xff08;如数据库、表等&#xff09;时&#xff0c;如果有程序或进程正在使用该对象&#xff0c;您可能会收到一个错误信息&#xff0c;提示该对象正被使用。这通常是因为还有一个或多个数据库连接仍然保持着对该…

易备数据备份软件: 快速备份 MySQL\SQL Server\Oracle\泛微 OA 数据库

易备数据备份软件支持对 SQL Server、Oracle、MySQL、PostgreSQL、MariaDB、泛微 OA 等数据库进行快速备份&#xff0c;备份过程不会对任何服务造成中断。 使用一份授权&#xff0c;可以备份无限量的数据库&#xff0c;不管数据库服务器是否在本机、本地网络、或是远程网络。可…

【C++风云录】光芒背后的功臣:医疗影像处理与医学成像

打开技术宝库&#xff1a;从视觉分析到医学影像 前言 在信息技术的日益发展下&#xff0c;各种开源工具库的出现大大促进了软件开发的进步。本文将对六种主要的开放源码软件库进行详细的介绍和分析&#xff0c;包括其概述&#xff0c;主要功能以及应用实施案例。 欢迎订阅专栏…

Vitis HLS 学习笔记--控制驱动TLP-处理deadlock

目录 1. 简介 2. 代码解析 2.1 HLS kernel代码 2.2 查看接口报告 2.3 TestBench 2.4 Dataflow 报告 3. Takeaways 4. 总结 1. 简介 本文是对《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》实验内容的详细解释。 首先需要…

如何实现高内聚低耦合

一、定义 内聚&#xff1a;一个模块内各元素间&#xff0c;结合的紧密程度。 耦合&#xff1a;模块之间联系紧密程度 二、高内聚、低耦合的利弊 1、代码关系过于紧密&#xff0c;往往改一小段代码&#xff0c;需要整个项目做很大的改动。所以在实际开发中应该尽量避免过高的…

Python常见面试题(二)——numpy和pandas

一、NumPy和Pandas间的区别与练习 功能定位 NumPy主要用于数值计算&#xff0c;提供了多维数组对象ndarray&#xff0c;支持数组操作、线性代数、随机数生成等功能。 Pandas则建立在NumPy之上&#xff0c;提供了更高级的数据结构&#xff0c;主要用于数据分析&#xff0c;尤…

自动驾驶场景中的长尾问题怎么解决?

自动驾驶长尾问题是指自动驾驶汽车中的边缘情况&#xff0c;即发生概率较低的可能场景。感知的长尾问题是当前限制单车智能自动驾驶车辆运行设计域的主要原因之一。自动驾驶的底层架构和大部分技术问题已经被解决&#xff0c;剩下的5%的长尾问题&#xff0c;逐渐成了制约自动驾…

huggingface 笔记:查看GPU占用情况

0 准备部分 0.1 创建虚拟数据 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

学习和分享关于 Vue.js 的路由(vue-router)

学习和分享关于 Vue.js 的路由&#xff08;vue-router&#xff09;是一个非常有价值的主题&#xff0c;因为路由是构建单页应用程序&#xff08;SPA&#xff09;的核心部分。本文将介绍 Vue.js 路由的基本概念和实现&#xff0c;并展示一个典型的项目目录结构。 目录 Vue.js 路…

【代码随想录训练营】【Day 29】【回溯-3】| Leetcode 39, 41, 131

【代码随想录训练营】【Day 29】【回溯-3】| Leetcode 39&#xff0c; 41&#xff0c; 131 需强化知识点 startInex作用&#xff1a;一是处理是否可以有重复值&#xff0c;二是实现纵向遍历&#xff08;不能没有&#xff09;去重要在数组有序的前提下进行分割问题 题目 39.…

工业控制2D组态界面,丑是丑了点,但非常实用。

工业控制的2D组态界面是用于监控和控制工业过程的界面。它通常具有以下特征&#xff1a; 实时数据显示&#xff1a;2D组态界面能够实时显示传感器和设备的数据&#xff0c;如温度、压力、流量等。这些数据以图表、仪表盘、数字显示等形式呈现&#xff0c;使操作人员能够实时了解…

Android:使用Kotlin搭建MVVM架构模式

一、简介Android MVVM架构模式 MVVM全称&#xff1a;Model、View、ViewModel&#xff1b; Model&#xff1a;负责数据的请求、解析、过滤等数据层操作&#xff0c;其中Repository: 提供数据的 API&#xff08;从本地或者网络&#xff09;。View&#xff1a;负责视图部分展示Vie…

Spring (18)什么是JdbcTemplate

JdbcTemplate 是 Spring 框架提供的一个主要的类&#xff0c;旨在简化传统 JDBC 的使用。它处理了诸如连接管理、异常处理等繁琐的低级任务&#xff0c;让开发者可以更专注于执行 SQL 语句和处理结果。JdbcTemplate 属于 Spring JDBC 模块&#xff08;spring-jdbc&#xff09;&…