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

QML学习笔记(五十)QML与C++交互:QML中单例C++对象

前言

上一节中,我们可以在qml侧实现C++类的实例,将C++实例对象的创建和生命周期交给qml侧,但除了这种直接创建对象的方式,还有一种很常用的设计模式——单例模式。
单例模式简单来说就是在我们的程序中,这个C++类只能存在一个实际的对象,不可以new多个。它通常会将构造函数放到private下,然后提供一个static修饰的intance接口来获取唯一的对象。单例模式一般会用于各种配置类、管理类的实现上。如果单例模式还不熟悉的话,建议先自行了解一下。
接下来,将介绍如何在qml中实现一个c++的单例对象。

一、代码演示

先实现我们带有单例设计模式的自定义类:

#ifndef MYSINGLETON_H
#define MYSINGLETON_H#include <QObject>
#include <QtQml>
#include <QDebug>class MySingleton : public QObject
{Q_OBJECT// QT6
//    QML_SINGLETON
//    QML_ELEMENTpublic:static MySingleton *instance();   // 全局访问点Q_INVOKABLE void doSomething() const{qDebug()<<"Doing something...";}signals:private:explicit MySingleton(QObject *parent = nullptr);static MySingleton *m_instance;};
#include "mysingleton.h"MySingleton *MySingleton::m_instance = nullptr;MySingleton *MySingleton::instance()
{if (!m_instance) {m_instance = new MySingleton;qDebug()<<"create MySingleton...";}return m_instance;
}MySingleton::MySingleton(QObject *parent) : QObject(parent)
{}

这里实现了最简单的单例创建和一个任务函数的接口。
然后是main函数:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "mysingleton.h"// 包装函数:Qt5 要求返回 QJSValue
static QObject *singleton_provider(QQmlEngine *, QJSEngine *)
{qDebug()<<"singleton_provider";return MySingleton::instance();
}int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;// 1qmlRegisterSingletonType<MySingleton>("com.mycompany", 1, 0, "Singleton", singleton_provider);// 2 (QT6可以,但QT5不允许传入对象指针,只能传入函数指针,
//    MySingleton *singleton = MySingleton::instance();
//    qmlRegisterSingletonType<MySingleton>("com.mycompany", 1, 0, "Singleton", singleton);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();
}

这里先是设计了一个函数指针,可以提供一个单例对象(实际上只会创建一次)。

static QObject *singleton_provider(QQmlEngine *, QJSEngine *)
{qDebug()<<"singleton_provider";return MySingleton::instance();
}

然后我们使用qmlRegisterSingletonType方法,将这个单例的对象,准确来说是实现这个单例对象的提供器函数指针设置进去,我们可以设置这个单例对象的别名,还有模块名和版本号。
接着,我们就可以在qml侧使用它啦。

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.12
import com.mycompany 1.0   // 模块名Window {visible: truewidth: 640height: 480title: qsTr("Singleton demo")Button{id: buttonIdtext: "Click"onClicked: function(){console.log("button click...")Singleton.doSomething()}}
}

使用时无需创建对象,直接调接口就行了Singleton.doSomething()
如果想要像其他类对象那样创建,是不行的哦。

    Singleton {id: singleton}

在这里插入图片描述
在高版本qt6中,可能会有不同的表现。
运行效果:
在这里插入图片描述
从打印效果得知,我们是从按钮按下的那一刻,才会出发提供单例对象的函数,然后才创建了单例对象,执行了我们希望的单例对象内的函数。
实际上这种方式是单例模式中的懒汉式,第一次使用的时候才new它。

二、QT6可能的改进

一个就是刚才说的,我们也可以尝试饿汉式的单例加载,也就是:

MySingleton *singleton = MySingleton::instance();
qmlRegisterSingletonType<MySingleton>("com.mycompany", 1, 0, "Singleton", singleton);

不传函数指针,直接传实现构建好的对象。
另一个就是直接使用两个宏:

QML_SINGLETON
QML_ELEMENT

这样的话就可以不用qmlRegisterSingletonType来进行注册了,缺点是无法指定别名、模块名和版本名,这一点和上一节中注册对象的是一样的。

三、总结

本节我们介绍了在qml侧使用c++单例对象的方式,这可能会给我们接下来的开发提供思路和帮助。

http://www.dtcms.com/a/557637.html

相关文章:

  • (108页PPT)金属加工行业智能工厂系统解决方案(附下载方式)
  • 网站建设情况说明搭建网站要什么显卡
  • C++11新特性基础知识点汇总
  • 网站icp查询系统山东seo网络营销推广
  • Vue.js 3的组合式API
  • 竞品对比分析:我们的系统 vs Reddit Answer
  • SQLite AND/OR 运算符
  • 物理仿真学习笔记 第一篇:绳子(弹簧振子系统,阻尼)
  • 柳州游戏网站建设seo综合查询网站
  • 网站推广的短视频推广wordpress 文章导入
  • SQL学习之常见函数和连接查询
  • html制作企业宣传网站wordpress企业网站开发
  • 建立个人网站的步骤有哪些wordpress 下雪插件
  • LLMs之HPT:《Towards a Unified View of Large Language Model Post-Training》翻译与解读
  • 茂名网站建设系统网站开发毕业设计文献综述
  • 便携式功耗分析仪LuatOS IoT Power vs. Nordic PPK2
  • 易语言做网站登录茶叶品质网站建设
  • JVM 调优实战:从线上问题复盘到精细化内存治理
  • 龙岗网站建设方案网站建设推广培训
  • 多模态生成 DALL-E
  • 网站做任务赚佣金网站建设推广费怎么做账
  • 提供设计网站效果图wordpress主题标签
  • 怎样建立个人网站网站建设空间域名是什么意思
  • python进阶教程15:单例模式、工厂模式和适配器模式
  • 购物网站开发设计文档电子商务网站案例分析
  • 360免费网站建设做网站要买什么空间
  • 统计数学---数据归一化(Data Normalization)
  • 漳州网站建设网站运营北京最牛计算机培训机构
  • 【51单片机】【protues仿真】基于51单片机自动浇花系统
  • 2003系统建网站福清做网站的公司