如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }

简介: 如何理解 QML_ELEMENT QML_SINGLETON staic Foo *create(QQmlEngine *, QJSEngine *){return s instance; }

如何理解

QML_ELEMENT 
 QML_SINGLETON 
 staic Foo *create(QQmlEngine *, QJSEngine *){
  return s_instance;
 }

这段代码涉及在 Qt 中使用 QML 元素和单例模式,结合了 QML_ELEMENT 和 QML_SINGLETON 宏以及一个静态工厂方法。下面是对这些概念和代码的解释。

关键概念

  1. QML_ELEMENT:

QML_ELEMENT 是一个宏,用于将一个 C++ 类暴露给 QML,使其可以作为 QML 类型使用。使用这个宏后,类可以直接在 QML 中被引用和实例化,类似于 QML 中的内置元素。
这个宏通常放在类声明中,如下所示:

class Foo : public QObject {
    Q_OBJECT
    QML_ELEMENT
    // 类的声明...
};

这使得 Foo 类可以在 QML 文件中直接使用。

  1. QML_SINGLETON:
    QML_SINGLETON 是另一个宏,它与 QML_ELEMENT 类似,但用于将一个类注册为单例,这意味着这个类在 QML 环境中只会有一个实例。

配合 QML_SINGLETON 使用时,QML 中对该类型的引用总是指向相同的实例,而不是每次都创建新的实例。

  1. 静态工厂方法 create(QQmlEngine *, QJSEngine *):

这是一个静态方法,通常与 QML_SINGLETON 一起使用,用于提供对单例对象的访问。

参数 QQmlEngine* 和 QJSEngine* 是 QML 引擎和 JavaScript 引擎的指针,通常在这个静态方法中没有被使用,但它们是 QML 注册时的要求。

该方法返回一个指向 Foo 类静态实例的指针(例如 s_instance),确保 QML 中使用的总是同一个 Foo 实例。

代码片段解释

static Foo *create(QQmlEngine *, QJSEngine *) {
    return s_instance;
}

静态方法:这个 create 方法是静态的,意味着它属于类本身,而不是某个具体的对象实例。

返回单例实例:return s_instance; 返回的是一个指向单例对象的指针 s_instance。s_instance 应该是在 Foo 类中定义的一个静态成员变量,确保在整个程序生命周期内只有一个 Foo 实例。


实现过程

假设有一个 Foo 类,并希望将其注册为 QML 中的单例元素:

// Foo.h
#ifndef FOO_H
#define FOO_H

#include <QObject>
#include <QQmlEngine>
#include <QJSEngine>

class Foo : public QObject
{
    Q_OBJECT
    QML_ELEMENT       // 将 Foo 暴露给 QML
    QML_SINGLETON     // 将 Foo 注册为单例

public:
    // 静态方法,返回单例实例
    static Foo* create(QQmlEngine*, QJSEngine*) {
        static Foo s_instance;  // 创建并持有一个单例实例
        return &s_instance;
    }

private:
    Foo() {}  // 私有构造函数,防止外部实例化
};

#endif // FOO_H

在 QML 中使用

在 main.cpp 文件中,将单例注册到 QML 引擎:

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "Foo.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    // 通过静态工厂函数注册 QML 单例
    qmlRegisterSingletonType<Foo>("com.example.foo", 1, 0, "Foo", &Foo::create);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

然后在 QML 文件中,可以这样使用 Foo:

// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import com.example.foo 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    // 使用 Foo 单例
    Text {
        text: Foo.someProperty
    }
}

总结

QML_ELEMENT:允许类作为 QML 元素使用。

QML_SINGLETON:确保类在 QML 中只实例化一次,作为单例使用。

create 静态方法:用于提供 QML 引擎访问单例实例的接口。

通过这种方式,Foo 类被暴露为 QML 元素,并且作为单例被使用,从而确保整个应用中 Foo 只有一个实例。这种设计在需要共享数据或状态的场景中特别有用。

目录
相关文章
|
缓存 Ubuntu JavaScript
踩坑记录:QML加载图片资源
踩坑记录:QML加载图片资源
2726 0
|
前端开发 JavaScript C++
打造卓越 QML 层级设计:从入门到精通(一)
打造卓越 QML 层级设计:从入门到精通
4422 1
|
存储 缓存 JavaScript
深入了解 Pinia:现代 Vue 应用的状态管理利器
深入了解 Pinia:现代 Vue 应用的状态管理利器
深入了解 Pinia:现代 Vue 应用的状态管理利器
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
739 0
|
10月前
|
Ubuntu Linux 数据安全/隐私保护
Ubuntu系统安装详细教程
确认您的选择无误后,安装程序将正式启动。请耐心等待,直至程序运行完毕并提示您重启。随后,您可以安全地移除安装盘,并重启计算机。至此,系统安装已全部完成!
|
12月前
|
JSON 安全 定位技术
微信附近人提取v3脚本, 微信附近人id提取技术插件,采集附近人wxid数据工具
本内容介绍微信“附近的人”功能的技术原理与实现方法,基于LBS服务,涉及位置模拟、协议分析及数据解析。通过修改GPS坐标或使用Frida等工具hook位置函数
【第二章】信号与槽——connect函数的用法
【第二章】信号与槽——connect函数的用法
|
人工智能 数据可视化 程序员
2024年值得推荐的4款免费且功能强大的在线文档工具
2024年值得推荐的4款免费且功能强大的在线文档工具
1127 4
2024年值得推荐的4款免费且功能强大的在线文档工具
qml import 自定义模块 cmake
qml import 自定义模块 cmake
1209 1
|
开发工具 数据安全/隐私保护 git
解决方案:Github Support for password authentication was removed on August 13, 2021.
解决方案:Github Support for password authentication was removed on August 13, 2021.
1414 1
解决方案:Github Support for password authentication was removed on August 13, 2021.