一、创建QML单例的几种方式

在我们开发项目时,一般都会单独写一个文件作为全局的配置文件。而这个文件一般都是全局只能有一个对象。因此在QML文件中,也提供了创建单例的方法。

1.纯QML文件创建单例模式

1.1假设有配置文件名为:Config.qml,内容如下:

pragma Singleton  //qml开头必须要有这一句

import QtQuick 2.9

QtObject {
id: config
objectName: "config"

property color backgroundColor: "#f9f9f9" //背景颜色
}

如上所示,该QML文件和普通QML文件不同之处在于文件第一行为:

pragma Singleton

1.2在Config.qml同级目录创建 qmldir 文件:

singleton Config Config.qml

如上所示,用singleton 来做声明。

1.3具体使用方法:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
import Qt.labs.platform 1.1
import "../public"

ApplicationWindow {
x:300;
y:50;
width: 720;
height: 480;
visible: true;
title: qsTr("test singleton");

background: Rectangle {
color:Config.backgroundColor;
}
}

2.使用qmlRegisterSingletonType方式创建单例

为什么要使用这种方式?因为我的项目中用的都是qml插件方式来组合的。并且全局的东西我分离出来为一个单独的插件。因此我需要把Config.qml内容导出。

基于上面的场景,只需要在xxxxx_plugin.cpp文件中加入以下内容:

#include "qmlglobalfilemoduleplugins_plugin.h"

#include "globalfileitem.h"

#include <qqml.h>

void QmlglobalfilemodulepluginsPlugin::registerTypes(const char *uri)
{
// @uri qmlglobalfilecomponents
qmlRegisterType<GlobalFileItem>(uri, 1, 0, "GlobalFileItem");

//导出自己加的qml文件
//qmlRegisterType(QUrl("qrc:/qml/Config.qml"), uri, 1, 0, "GlobalConfig");//该导出语句会出错
qmlRegisterSingletonType(QUrl("qrc:/qml/Config.qml"), uri, 1, 0, "GlobalConfig");
}

 运行结果:

创建QML单例在项目中使用_单例模式

一个是在main.qml中,一个是在插件中。但是打印出来的对象都是同一个。