Qt中的单例模式来啦
总的来说,需要完成那些事呢?
- 首先,您需要在QML脚本中使用pragma Singleton关键字,
- 然后您需要将该组件注册为单例,
- 最后您需要将它导入到需要使用他的其它QML文件中。
第一步:将一个QML组件声明为单例
假设以下使我们将要进行单例的文件
//MyStyleObject.qml import QtQuick 2.0 Item { readonly property string colourBlue: "blue" readonly property string colourRed: "red" readonly property int fontPointSize: 16 }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
要将其进行单例化,首先您需要在首行添加如下语句
//MyStyleObject.qml pragma Singleton //注意这里 import QtQuick 2.0 Item { readonly property string colourBlue: "blue" readonly property string colourRed: "red" readonly property int fontPointSize: 16 }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第二步:注册组件
现在您有两种选择
- 您可以在C++中注册组件,
- 或者使用qmldir文件。
C++中实现
要在您的C ++代码的某个地方通过C ++注册单例,您需要调用qmlRegisterSingletonType()
。
#include <QtQml> ... qmlRegisterSingletonType( QUrl("file:///absolute/path/MyStyleObject.qml"), "ca.imaginativethinking.tutorial.style", 1, 0, "MyStyle" ); ...
- 1
- 2
- 3
- 4
QML中实现
如果将调用添加到qmlRegisterSingletonType()
不适用于您,也许这是一个Qt Quick UI项目(即没有C ++),那么您可以将名为qmldir
的文件添加到MyStyleObject.qml
文件所在的目录。 在导入目录时,QML引擎首先查找qmldir文件并使用它导入在该目录中找到的脚本; 如果该文件不存在,它将导入使用默认值(即非单例并使用文件名称作为组件名称)找到的脚本。 qmldir文件可以定义不同的名称来代替文件名,还可以指示将脚本注册为单例。
目录结构应该如下所示:
/root + absolute | + path | | + qmldir | | + MyStyleObject.qml | | + AnotherObject.qml | | + MyButton.qml | | + MySwitch.qml | + main.qml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
以下是qmldir应该有的样子:
singleton MyStyle 1.0 MyStyleObject.qml MyOtherObject 1.0 AnotherObject.qml MyButton 1.0 MyButton.qml
- 1
- 2
- 3
请注意,如果在目录中找到脚本但未在qmldir文件中声明脚本,它仍会导入,但使用默认设置。 MySwich.qml将被导入并使用名称MySwitch注册为非单例。 您可以在这里看到,我们也可以使用qmldir来定义组件的文件名之外的其他名称,MyButton被注册为使用默认的文件名,但AnotherObject.qml被注册为使用名称MyOtherObject。
第三步:导入并使用单例
C++中实现
如果您使用上面的C ++选项,那么为了在您的QML脚本中导入和使用单例,您需要通过qmlRegisterSingletonType()
的第二个参数导入您定义的模块,然后使用注册名称(参数三qmlRegisterSingletonType
))。
//main.qml import QtQuick 2.0 import wanywhn.style 1.0 Rectangle { anchors.fill: parent color: MyStyle.colourBlue // <-- 注意这里 }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
QML中实现
如果您使用qmldir方法,那么您只需导入文件所在的目录。
//main.qml import QtQuick 2.0 import "path" Rectangle { anchors.fill: parent color: MyStyle.colourBlue // <-- 注意这里 }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
但是请注意,如果main.qml位于路径目录中,您仍然必须导入该路径,因为当您依靠自动查找时,qmldir文件不会被使用。
那么使用效果如何呢?
代码地址
让我们尝试创建一千个方块。当然这里会有两种方式
Component { id: gridDelegateUsingAnInstanceStyleObject Rectangle { width: 50 height: width color: myStyle.colourBlue border.color: myStyle.colourRed border.width: myStyle.borderSize Text { anchors.centerIn: parent text: index font.pointSize: myStyle.fontPointSize color: myStyle.colourWhite } MyStyleObject { id: myStyle //<-- 注意这里,当您使用myStyle时,他指向一个实例对象 } } } Component { id: gridDelegateUsingASingletonStyleObject Rectangle { width: 50 height: width color: MyStyle.colourBlue //<-- 注意当使用MyStyle(大写字母M)时,您指的是qml目录文件中定义的单例。 border.color: MyStyle.colourRed border.width: MyStyle.borderSize Text { anchors.centerIn: parent text: index font.pointSize: MyStyle.fontPointSize color: MyStyle.colourWhite } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
分别使用这两个delegate,使用QML 分析器查看效果
效果
不用说都清楚了吧。;)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Windows 10 设置 Java 环境变量
首先你需要在我的电脑中打开,找到环境变量属性。 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面。 在这个界面中设置高级系统设置。 环境变量 在弹出的界面中选择设置环境变量。 系统变量 你需要在弹出的界面中选择系统变量。 如果你的系统变量中已经有 JAVA_HOME 的话,你选择这个选项然后直接对安装的新 JDK 目录进行指派就可以了,如果你没有这个变量的话,你需要手动添加这个变量。 添加到 PATH 为了让你的系统能够识别 Java,你需要将变量添加到 PATH 中。 在系统变量中选择 PATH,然后在检查你的 PATH 中是否已经添加了 Java,如果没有的话,请进行添加,如果有的话就可以忽略这个步骤了。 确定下面 2 个变量在你的系统 PATH 里面就可以了。 至于CLASSPATH 是否需要配置,根据情况就可以了。目前的 JDK 版本一般要求不需要配置CLASSPATH。 https://www.cwiki.us/pages/viewpage.action?pageId=37492931
- 下一篇
11大Java开源中文分词器的使用方法和分词效果对比
本文的目标有两个: 1、学会使用11大Java开源中文分词器 2、对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: 从上面的定义我们知道,在Java中,同样的方法名称和参数,但是返回值不同,这种情况不可以使用重载。 这两个方法的区别在于返回值,每一个分词器都可能有多种分词模式,每种模式的分词结果都可能不相同,第一个方法忽略分词器模式,返回所有模式的所有不重复分词结果,第二个方法返回每一种分词器模式及其对应的分词结果。 在这里,需要注意的是我们使用了Java8中的新特性默认方法,并使用stream把一个map的value转换为不重复的集合。 下面我们利用这11大分词器来实现这个接口: 1、word分词器 2、Ansj分词器 3、Stanford分词器 4、FudanNLP分词器 5、Jieba分词器 6、Jcseg分词器 7、MMSeg4j分词器 8、IKAnal...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器