一、创建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");
}
运行结果:
一个是在main.qml中,一个是在插件中。但是打印出来的对象都是同一个。