【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中实例化多次,所以就有了本次单例的做法。

类型定义:

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

cpp 复制代码
//-----------cppbase.h--------------

#ifndef CPPBASE_H
#define CPPBASE_H

#include <QObject>
#include <QQmlEngine>

class CppBase : public QObject
{
    Q_OBJECT
    QML_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应用。

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

单例注册:

cpp 复制代码
qmlRegisterSingletonInstance("CppBase",  1, 0, "CppBase", CppBase::instance());

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

qml调用:

javascript 复制代码
import CppBase

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

行了。

总结:

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

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

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

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

cpp 复制代码
qmlRegisterType<CppBase> ("CppBase",  1, 0, "CppBase");

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

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

本文完。

相关推荐
sulikey35 分钟前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
sulikey5 小时前
Qt 入门简洁笔记:信号与槽
前端·c++·笔记·qt·前端框架·1024程序员节·qt框架
yugi9878386 小时前
基于Qt实现百度地图路径规划功能
开发语言·qt
油炸自行车21 小时前
【Qt】VS Code配置Qt UI插件,vscode打开Qt Designer ,vscode打开Qt*.ui文件
qt·ui·cursor·qt designer·vscode插件·trae·qt ui
Jay Chou why did1 天前
3. Qt 信号槽
qt
包饭厅咸鱼1 天前
QT----使用onnxRuntime运行图像分类模型
开发语言·qt·分类
碰大点1 天前
Ubuntu 16.04交叉编译arm-linux-gnueabihf的QT5.6.2
linux·arm开发·qt·ubuntu·arm-linux
钱彬 (Qian Bin)2 天前
项目实践4—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
人工智能·qt·fastapi
钱彬 (Qian Bin)2 天前
项目实践3—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
人工智能·qt·fastapi
江公望2 天前
Qt qmlplugindump浅谈
开发语言·qt·qml