【QML qmlRegisterType】qmlRegisterType 的功能以及用法

 


1、qmlRegisterType

qmlRegisterType 是 Qt 提供的一个函数,用于将 C++ 类注册到 QML 环境中,使得这些类可以在 QML 文件中使用;<    >内为要注册的 C++ 类的类型

qmlRegisterType里总共4个参数:第一个参数指的是QML中import后的内容,相当于头文件名;第二个第三个参数分别是主次版本号;第四个指的是QML中类的名字。 

注意:第四个QML的类名首字母一定要大写,要不然会报错。。而且是那种你找不到的。。

实例

qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");

qml文件中

import com.mycompany.qmlcomponents 1.0
Slider {
}

2、qmlRegisterUncreatableType

qmlRegisterUncreatableType 用于注册不能直接在 QML 中实例化的 C++ 类,通常是因为这些类需要特定的构造函数或初始化过程。

int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason);
  • T:要注册的 C++ 类的类型。
  • uri:一个字符串,代表导入模块的名称。在 QML 文件中使用该类时,需要通过 import 语句导入这个模块。
  • versionMajor:模块的主版本号。
  • versionMinor:模块的次版本号。
  • qmlName:在 QML 中使用该类时的名称。
  • reason:一个字符串,解释为什么该类不能在 QML 中直接实例化。当在 QML 中尝试实例化该类时,会抛出包含此原因的错误信息。

实例

qmlRegisterUncreatableType<Vehicle>                 (kQGCVehicle,                       1, 0, "Vehicle",                    kRefOnly);  

第一个参数是要注册的 C++ 类的类型,如 Vehicle ;  第二个参数是导入模块的名称,kQGCVehicle 应该是一个预定义的字符串常量

第三和第四个参数是版本号                       第五个参数是 QML 中使用的类名

最后一个参数 kRefOnly 表示只能通过引用访问该类的实例

复制代码
有时候QObject派生类可能需要在QML类型系统中注册,但不能作为可实例化类型。例如,如果C ++类是这种情况:

1.是一个不应该实例化的接口类型

2.是不需要暴露给QML的基类类型

3.声明了一些应该可以从QML访问的枚举,但除此之外不应该是可实例化的

4.通过单例实例提供给QML的类型,不应该从QML实例化

QtQML模块提供用于登记非实例类型的几种方法:

qmlRegisterType()(不带参数)注册一个C ++类型,该类型不可实例化,不能从QML引用。这使得引擎可以强制从QML实例化的任何继承类型。

qmlRegisterInterface()注册具有特定QML类型名称的Qt接口类型。该类型不是从QML实例化的,但可以通过其类型名称引用。

qmlRegisterUncreatableType()注册一个不可实例化的命名C ++类型,但可以识别为QML类型系统的一个类型。如果类型的枚举或附加属性可以从QML访问,但是类型本身不应该是可实例化的,那么这个方法可以用到。

qmlRegisterSingletonType()注册一个可以从QML导入的单例类型。

注意,使用QML类型系统注册的所有C ++类型都必须是QObject派生的,即使是不可实例化类。
复制代码

3、qmlRegisterSingletonType

qmlRegisterSingletonType 是 Qt 提供的一个函数,用于将 C++ 类注册为 QML 单例类型。单例类型意味着在整个应用程序生命周期中,该类型只会有一个实例存在,并且可以在 QML 代码中全局访问

qmlRegisterSingletonType 有两种重载形式:
形式一:

int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, T *(*factory)(QQmlEngine *, QJSEngine *));

形式二:

int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QObject *(*factory)(QQmlEngine *, QJSEngine *));
  • T:要注册的 C++ 类的类型。
  • uri:一个字符串,表示导入模块的名称。在 QML 文件中使用该单例类型时,需要通过 import 语句导入这个模块。
  • versionMajor:模块的主版本号。
  • versionMinor:模块的次版本号。
  • qmlName:在 QML 中使用该单例类型时的名称。
  • factory:一个工厂函数,用于创建单例对象的实例。该函数接受两个参数:QQmlEngine * 和 QJSEngine *,分别代表 QML 引擎和 JavaScript 引擎。返回值为单例对象的指针。

使用场景

  • 全局配置管理:例如应用程序的全局设置、主题配置等,只需要一个实例来管理这些信息。
  • 全局服务:如网络服务、日志服务等,整个应用程序共享同一个服务实例。
  • 数据缓存:当需要在应用程序中共享某些数据缓存时,可以使用单例类型来管理这些缓存。

实例

 qmlRegisterSingletonType<QGroundControlQmlGlobal>   ("QGroundControl",                          1, 0, "QGroundControl",         qgroundcontrolQmlGlobalSingletonFactory);

第一个参数是单例类的类型,如 QGroundControlQmlGlobal   第二个参数是导入模块的名称,如 "QGroundControl"

 

第三和第四个参数是版本号     第五个参数是 QML 中使用的单例对象名称,如 "QGroundControl"。

最后一个参数是一个工厂函数,用于创建单例对象的实例,如 qgroundcontrolQmlGlobalSingletonFactory。

 

posted @   taohuaxiaochunfeng  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示

目录导航