【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使用。

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

#ifndef CPPDB_H
#define CPPDB_H

#include <QObject>
#include <QQmlEngine>

class CppDB : public QObject
{
    Q_OBJECT
    QML_ELEMENT
public:
    explicit CppDB(QObject *parent = nullptr);

public:
    //Logs
    Q_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函数中调用一行即可。以后方便维护。

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

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

qml调用:

接着在qml中这样用:

javascript 复制代码
import CppDB

Item {
    CppDB { id: _cppDB }

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

总结:

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

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

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

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

本文完。

相关推荐
Lhan.zzZ2 小时前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
skr爱码士10 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt·ui·客户端
Quz11 小时前
QML 拖拽篇:看板拖拽与数字拼图
qt
长友cy11 小时前
Qt官方示例Application源码阅读
开发语言·qt
程与留1 天前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt
程与留1 天前
14_Qt 样式表(QSS)入门(语法、选择器、美化实战)
c++·qt
Quz1 天前
QML 拖拽篇:接收拖拽与数据交换
qt
张人玉2 天前
基于 Python 机器学习 与 PyQt5 桌面框架开发的可视化分析系统——基于大数据的网上购物消费行为分析可视化大屏
python·qt·机器学习·echarts·three.js
「QT(C++)开发工程师」2 天前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
小镇敲码人2 天前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http