前言
其实这个单例模式,我已经使用了2年多了,从接触qml时候就会用了,一直也没记录,现在感觉脑子不好用了,反反复复感觉老是容易忘记一些细节性的东西,所以记录一下,当然里面也会说到一些小技巧和对应的BUG解决。
问题
回归正题,如何在整个QML工程界面中使用一些公用的数据和方法呢?毋庸置疑,肯定是单例模式,很多人可能习惯使用了C++单例模式,定然想不到QML也有单例模式,所以一般在QML界面直接使用自定义的QML文件单例比在C++实现单例然后注册给QML使用要方便和灵活多。
好了,说了这么多,直接上代码把:
【以下是核心代码】
pragma Singleton
import QtQuick 2.12
/**
* @brief: qml单例模式
* @author: Fu_Lin
* @date: 2019-03-29
* @description: 主要记录一些公用的数据和方法
*/
QtObject {
property string blueColor: "blue"
property int textSize: 20
property string bgColor:"red"
}
qmldir
singleton QmlSingleton 1.0 QmlSingleton.qml
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import "." //单例模式必须显式的调用qmldir文件
Window {
id: id_window
visible: true
width: 640
height: 480
title: qsTr("testMain")
flags: Qt.Window | Qt.FramelessWindowHint //去掉标题栏
Rectangle {
anchors.fill: parent
color: QmlSingleton.blueColor //<---单例模式的调用
}
}
运行后的效果图:
小技巧记录
上面的代码已经是可以使用的单例文件了,值得注意的是单例模式必须显式的调用qmldir文件
如何将qmldir放到和main.qml一个文件下,只要"."打点获取当前qmldir目录即可,如果qmldir不在main.qml一个目录,而是放到了和单例文件一个目录,比如单例文件在XXX/qmlMoudel/Singleton目录下,而main.qml在XXX目录下,那么调用qmldir必须显示的导入该目录:
import "XXX/qmlMoudel/Singleton"
然后调用单例类即可,在这里说明一下,一般这样调用。
IDE会出现一个BUG:
就是它根本识别不来这个导入的路径,还会爆红警告,单例组件自然也就不能变更颜色,不会补全,会让人感觉好像是错的,其实只要运行效果还是有的,只是有不好看的红色警告,要想IDE识别,只需要关闭当前工程,再关闭IDE,重新打开IDE,再打开工程,这个时候单例组件就会被识别了,补全功能自然也就有了。
PS: 所以一般为了方便我都是打点(import “.”)导入,将qmldir放到和main.qml一个层级,毕竟每次写出一大串路径实在太累。