当前位置: 首页 > news >正文

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

背景:

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

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

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

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

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

此篇接着上篇的话题,“类型多例”这个是我造的词,这种方式使用简单,如果咱们是熟悉qt的程序员,c++部分不需要特别注意,只要Q_INVOKABLE、槽、信号就行,亦即qml的工作原理。但之前提到,“类型多例”会在qml中实例化多次,所以就有了本次单例的做法。

类型定义:

相当于做个单例模式,但不太一样。

//-----------cppbase.h--------------#ifndef CPPBASE_H
#define CPPBASE_H#include <QObject>
#include <QQmlEngine>class CppBase : public QObject
{Q_OBJECTQML_ELEMENT
public:explicit CppBase(QObject *parent = nullptr);static CppBase* instance();//这里Q_INVOKABLE QString f_INI_GetUserInfo();
};#endif // CPPBASE_H//-----------cppbase.cpp--------------#include "cppbase.h"Q_GLOBAL_STATIC(CppBase, globalCppBase)//这里CppBase* CppBase::instance() //这里
{return globalCppBase();
}CppBase::CppBase(QObject *parent): QObject{parent}
{}QString CppBase::f_INI_GetUserInfo()
{ ... }

上面需要注意不一样的地方我加了注释。这里不讨论线程安全或者单例模式本身的话题,只说qml应用。

用它这个宏,如果不换行会有错误提示,换行了也有别的错误提示,还要求构造公有。如果不用这个宏,可以写个传统单例一样用。

单例注册:

qmlRegisterSingletonInstance("CppBase",  1, 0, "CppBase", CppBase::instance());

还是俩字符串参数,第一个用于import,第二个用于qml中类型引用。这里注册的是单例。

qml调用:

import CppBaseItem {function f() {let sJsonStr = CppBase.f_INI_GetUserInfo();}
}

行了。

总结:

方法也越来越简练了。还是三步:定义、注册、使用。

关于自动补全,其实从第一种“实例方式”开始,qml都可以提示自动补全的,就是“实例注入”方式可能要运行一下才能提示,这个自从用了cmake以后,我觉得跟build目录里生成的一堆有关系。这里不深究了。

其它几种调用c++的方式都很方便,在qml中都有补全提示和高亮显示。

如果需要成员的补全提示,比如打个点能提示函数名,就需要向qml注册类型,而不是只注册单例,就像c++里只引用可以前置声明,想用里面东西还得包含头文件,一个道理。如下:

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

我是为了方便注册类型了。

creator还可以给js打断点调试,非常方便。

本文完。

http://www.lryc.cn/news/625374.html

相关文章:

  • 如何计算 PCM 音频与 YUV/RGB 原始视频文件大小?
  • 【Git Submodules 与微前端架构技术指南】
  • 指针的应用学习日记
  • Hive 存储管理测试用例设计指南
  • CSDN 创始人蒋涛:以开源驱动技术创新,拥抱黄金十年
  • 【SpringBoot】15 核心功能 - Web开发原理 - 请求处理 - 常用请求参数注解
  • 如何安全删除GitHub中的敏感文件?git-filter-repo操作全解析
  • 玳瑁的嵌入式日记D20-08019(数据结构)
  • Hive常用命令参考
  • 开源游戏引擎Bevy 和 Godot
  • 分布式搜索(Elasticsearch)深入用法
  • Leetcode 3652. Best Time to Buy and Sell Stock using Strategy
  • 【Rust嵌入式键值对数据库redb】第一课 第一次写入
  • 极品飞车21:热度(NFS Heat)
  • React native Navigation 详解
  • 2020年EAAI SCI1区TOP,基于ORPFOA算法的多无人机在线变化任务路径规划,深度解析+性能实测
  • 跟踪不稳定目标:基于外观引导的运动建模实现无人机视频中的鲁棒多目标跟踪
  • 面试题储备-MQ篇 2-说说你对RocketMQ的理解
  • 智慧养老中IPTV融合对讲:重塑养老沟通新生态
  • 【Qt开发】常用控件(五)
  • 金融行业私域运营:企业微信+AI如何实现数智化经营?
  • LeetCode-17day:贪心算法
  • 云计算核心技术之云存储技术
  • C语言基础:(十九)数据在内存中的存储
  • MoonBit Perals Vol.06: Moonbit 与 LLVM 共舞 (上):编译前端实现
  • consul-基础概念
  • 一个多功能的文件分享工具--zdir手动部署教程
  • Tesollo DeltoGripper DG-5F具有抓握和操纵能力的灵巧手
  • Swift与C++混编深度解决方案:手动桥接 vs SwiftyCPP框架性能终极评测
  • 垂直领域大模型构建:法律行业“类ChatGPT”系统的训练与落地