【qml-4】qml与c++交互(类型多例)

背景:

【qml-1】qml与c++交互第一次尝试(实例注入)

【qml-2】尝试一个有模式的qml弹窗

【qml-3】qml与c++交互第二次尝试(类型注册)

【qml-4】qml与c++交互(类型多例)

【qml-5】qml与c++交互(类型单例)

之前提到的“实例注入”方式,是在c++中实例化再注入qml,手册中是不推荐这么做的。问AI答案是:

        为什么避免context properties:
        破坏组件封装性
        使数据流难以追踪
        导致组件难以单独测试
        可能产生循环依赖

我认为有兴趣可以研究。

而之前提到的类型方式,用起来也不是我想要的“简洁”效果,实际项目中我用了一种自认为比较方便的用法,记录下来。

qml项目建议:

之前提到过qml分离方式我试出来并不好,于是使用qrc方式。我是从Design Studio里做好界面导出qrc,然后把qml目录和qrc复制到c++项目中使用的。

实际DS应该可以生成cmake,可以直接用creator原地打开项目,但它生成的东西太多,我就没有采用这种方式。

类型定义:

写个c++类,供qml使用。

//-----------------------cppdb.h------------------------------#ifndef CPPDB_H
#define CPPDB_H#include <QObject>
#include <QQmlEngine>class CppDB : public QObject
{Q_OBJECTQML_ELEMENT
public:explicit CppDB(QObject *parent = nullptr);public://LogsQ_INVOKABLE void f_Logs_Write(QString sLogText);
};#endif // CPPDB_H//-----------------------cppdb.cpp--------------------------#include "cppdb.h"CppDB::CppDB(QObject *parent): QObject{parent}
{}
/*** Write the logs to db.*/
void CppDB::f_Logs_Write(QString sLogText)
{...
}

类型注册:

程序加载时调用即可,比如main函数中,应该放在qml load之前。我习惯是用另一个静态类写成静态函数,main函数中调用一行即可。以后方便维护。

    qmlRegisterType<CppDB>("CppDB", 1, 0, "CppDB");

其中,第一个字符串用于qml中的import,第二个字符串用于qml中的类型引用(类似Button和Text)。然后就没有然后了,简单吧。

qml调用:

接着在qml中这样用:

import CppDBItem {CppDB { id: _cppDB }function f() {_cppDB.f_Logs_Write(qsTr("这条写入日志。举个例子而已。"));}
}

总结:

上面就三步,不需要改qmakelists.txt,不需要涉及路径,我认为已经非常简练。

但要明白,这种用法跟自己写了个qml的Button一样,它就是个类型,qml中使用{}实例化它。亦即,如果这个类型在多个qml中使用,那就实例化了多份,所以本篇的题目注释叫(类型多例方式)。

因此,这种方法利弊共存,看你怎么想了。我是个人认为,除了浪费内存,没啥不好,简洁好维护。

所以就有了后面的“类型单例”方式。

本文完。

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

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

相关文章

图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库

随着 Web3 生态的不断演进&#xff0c;链上风险呈现出团伙化、隐蔽化和动态化的趋势&#xff0c;传统的单点风控手段已难以应对复杂多变的攻击模式。尤其在批量注册薅羊毛与链上交易盗转洗钱等高频风险场景中&#xff0c;攻击者往往通过伪造身份、跨链操作、多层嵌套转账等方式…

恒流源电路学习

恒流源的设计原理&#xff1a; 如图所示你可以看到右边的的推到公式得到红点处的电压是一个和左边相关的定值&#xff0c;所以呢右边的电流就是电压除以那个4Ω&#xff0c;所以得到右边的电路的电流大体是一个定值&#xff0c;不管你再加什么东西都可以保持这个电流&#xff…

基于生成对抗网络的模糊图像恢复原理与技术实现

1. 引言图像模糊是数字图像处理中的常见问题&#xff0c;其成因包括相机抖动、物体运动、聚焦不良等。传统方法如维纳滤波、Lucy-Richardson 算法等依赖于模糊核估计和逆滤波&#xff0c;在复杂场景下性能有限。生成对抗网络&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 变更修复

FE 恢复 异常日志 查看 fe.out 会有以下报错&#xff0c;此时 fe 进程是无法启动的&#xff0c;操作前注意备份所有 fe 的元数据并停止上游读写动作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系统应用收不到开机广播

安卓14系统应用收不到开机广播 - Wesley’s Blog 前段时间有测试反馈在安卓14 上面某系统应用恢复出厂设置后没有自启动&#xff0c;究竟是什么原因呢&#xff1f; 回顾 Android 从3.1开始&#xff0c;会将新安装并且从未被启动的应用置为“STOPPED”状态&#xff0c;或者被…

C# Attribute 方法扩展

场景 刚写完一个干净利落的方法&#xff0c;比如保存数据到数据库&#xff0c;逻辑清晰、结构优雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完数据&#xff0c;记得给客户发个邮件哦~” 第三天&#xff0c;“能不能再发个消息通知其他系统&#xff1f;” 第四天&am…

【URP】[法线贴图]为什么主要是蓝色的?

【从UnityURP开始探索游戏渲染】专栏-直达 法线贴图呈现蓝紫色调&#xff08;尤其以蓝色为主&#xff09;是由其‌存储原理、切线空间坐标系设计及颜色编码规则共同决定的‌。 核心原因&#xff1a;法线向量的存储规则‌ ‌法线向量的物理范围‌ 法线是单位向量&#xff0c;…

驱动开发系列63 - NVIDIA 开源GPU驱动open-gpu-kernel-modules编译调试

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…

对KingbaseES架构的解析:从读写分离到异地灾备的技术实现与保障机制

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告&#xff0c;并没有推广该平台 &#xff0c;为用户体验文章 本人旨在分享最真实的用户体验&#xff0c;为关注此类产品的朋友们提供一个客观的参考。 文章目录一、架构全景&#xff1a;四级高可用构建数字基础1.1 物…

Visual Studio中的常用调试功能(上)

1、利用断点进行调试添加断点的方式有以下几种1.键盘快捷键F92.通过菜单【Debug&#xff08;调试&#xff09;】-》【Toggle BreakPoint&#xff08;切换断点&#xff09;】3.点击代码行左边的空白处&#xff08;推荐&#xff09;设置断点后&#xff0c;按F5运行程序&#xff0…

Linux -- 线程同步

1.1条件变量 (1)当⼀个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做不了。 (2)例如⼀个线程访问队列时&#xff0c;发现队列为空&#xff0c;它只能等待&#xff0c;只到其它线程将⼀个节点添加到队列 中。这种情况就需要⽤到…

前端进阶指南:JavaScript性能优化实战全解析

深入剖析 JavaScript 性能瓶颈&#xff0c;分享优化技巧与最佳实践&#xff0c;让你的前端应用更快、更稳、更流畅。 &#x1f4d1; 目录 一、前言 二、性能瓶颈的常见来源 三、JavaScript代码优化技巧 1. 避免重复计算 2. 合理使用防抖与节流 3. 使用事件委托 四、渲染…

RabbitMQ:SpringAMQP Direct Exchange(直连型交换机)

目录一、案例需求二、基础配置三、代码实现直连型交换机也叫做定向交换机&#xff0c;通过RoutingKey绑定交换机与队列直接的关系。 生产者源码 消费者源码 一、案例需求 在RabbitMQ控制台中&#xff0c;声明队列direct.queue1和direct.queue2。在RabbitMQ控制台中&#xff…

implement libtime on Windows

因为Windows的time命令和Linux的time命令不一样&#xff0c;尝试实现libtime libtime.h /** libtime.h - 跨平台时间测量库* 功能&#xff1a;执行外部命令并测量其运行时间和资源使用*/#ifndef LIBTIME_H #define LIBTIME_H#include <stdio.h> #include <stdlib.h>…

Unity进阶--C#补充知识点--【C#各版本的新功能新语法】C#1~4与C#5

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.C#版本与Unity的关系 1.各Unity版本支持的C#版本 更多信息可以在Untiy官网说明查看 https://docs.unity3d.com/2020.3/Documentation/Manual/CSharpCompiler.html&#xff08;这个好…

水闸安全综合监测系统解决方案

一、方案概述 水闸作为重要的水利工程设施&#xff0c;承担着防洪、排涝、供水和灌溉等关键功能。其安全性直接关系到下游人民群众的生命财产安全以及区域经济的稳定发展。近年来&#xff0c;随着极端天气频发和工程老化问题日益突出&#xff0c;水闸安全监测工作显得尤为重要。…

基于单片机智能点滴输液系统

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 该系统基于单片机控制技术&#xff0c;结合传感器和无线通信模块&#xff0c;实现对输液过程的实…

AI数据仓库管理提升效率

内容概要在数字化转型浪潮中&#xff0c;AI数据仓库管理正重塑企业数据处理格局。本部分简要介绍其核心机制&#xff0c;即通过智能API接入外部数据源实现多平台数据无缝整合&#xff0c;随后应用数据清洗技术去除冗余信息&#xff0c;确保数据质量。同时&#xff0c;加密存储机…

使用 Docker 安装长安链管理平台 + 部署区块链与示例合约

文章目录简介登录官网GithubPodman 配置&#xff08;Docker 配置 registry 地址&#xff09;安装长安链管理平台下载源码docker-compose.yml登录管理平台部署区块链Dockerfile构建镜像部署长安链订阅区块链部署合约下载示例合约部署示例合约投票管理文件哈希存证查找存证信息区…

Python训练营打卡 DAY 41 简单CNN

知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch归一化层…