当前位置: 首页 > news >正文

QML 将一个qml文件定义为公共的全局单例

在c++中,可以将一个类定义为单例,然后其内部可以定义很多公共的函数或者变量供全局使用;

那么在qml中,其实也是可以有类似的操作的,例如新建一个qml文件,主要存储全局通用的函数、属性变量、信号等,为整个项目调用;

还有一个最重要的作用就是,当两个qml文件毫无关联时,但是a.qml需要触发b.qml某个动作时,就可以使用到全局单例做中转操作了;
例如在a.qml中触发单例里面的某个信号,在b.qml中绑定触发槽函数即可。

1 在项目中,新建一个BasicConfig.qml文件,为了模块化,新建一个文件夹basic,将文件新建在此;

/basic/BasicConfig.qml

在这里插入图片描述
填写BasicConfig.qml代码:

// 第一步,固定文本填写
pragma Singleton		// 这一行是必须写的import QtQuick 2.0QtObject {// 属性变量property int windowWidth: 1024// 函数:两数相加function funcAdd(a, b) {return a + b;}// 信号signal mySignal(int a);
}

2 然后继续新建一个空文件,没有后缀

填写qmldir代码:(名字可随意取,这里取名为:qmldir,如上图新建在BasicConfig.qml同级路径)

// 第三步
singleton BasicConfig BasicConfig.qml

3 在main.cpp中注册

#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);// 第二步:注册qml全局单例qmlRegisterSingletonType(QUrl("qrc:/BasicConfig.qml"), "BasicConfig", 1, 0, "BasicConfig");return app.exec();
}

4 导入

在需要使用的地方导入文件夹路径即可

import "./basic"

5 测试代码

import "./basic"Window {id: rootvisible: truewidth: 1280height: 800title: qsTr("Hello World")Component.onCompleted: {console.log(BasicConfig.funcAdd(10, 20))console.log(BasicConfig.windowWidth)}
}

编译输出:
在这里插入图片描述
可以正常使用了!

并且BasicConfig是单例的,不可以再定义这个组件了,如果定义就会编译报错:
在这里插入图片描述
在使用时,只能通过BasicConfig去使用,避免了定义多个组件的问题!

总结:
通过创建BasicConfig.qml文件,使用pragma Singleton声明单例,并定义全局属性、函数和信号。配合qmldir文件配置和main.cpp中的注册,可以像C++单例一样在项目各处调用。使用时只需导入路径,通过BasicConfig访问全局内容,且无法重复定义该组件。该方法有效实现了QML中的单例管理,便于维护全局状态和共享功能。

http://www.dtcms.com/a/313267.html

相关文章:

  • 外设数据到昇腾310推理卡 之五 3403ATU
  • 【分析学】Hilbert 空间
  • python脚本-ATE测试数据stdf文件自动处理之概率分布图、直方图、数据分布图
  • 说说对泛型的理解?
  • 数据资产——解读2025 数据提供合同(示范文本)【附全文阅读】
  • linux扩展磁盘容量到home下
  • Python篇---import
  • 线段树学习笔记 - 区间最值操作
  • 实战案例:容器数据卷四部曲(三)目录数据卷
  • DDR SDRAM中的DQS与DQ信号
  • 【网络安全】日志文件格式
  • 数据结构——单向链表
  • Kali基础知识点【1】
  • Pytorch-04 搭建神经网络架构工作流
  • TikTokShop-美国本土跨境-达人邀约_影刀RPA源码解读
  • 8.1.3 TiDB集群方案雨Replication原理
  • 关于逻辑回归的相关知识大全
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘scikit-learn’问题
  • 【AI】持久化聊天记忆(隔离对话)
  • ELECTRICAL靶机攻略
  • Linux驱动学习(四)字符设备
  • PyTorch生成式人工智能(24)——使用PyTorch构建Transformer模型
  • HBK公司核心产品和业务简析
  • 架构——异地多活成熟的架构模式
  • useSelector useDispatch
  • 高级开发 | 零人工干预的 @Value 实时刷新
  • 直流无刷电机(一)
  • ElementUI之使用以及表单验证
  • lumerical——锥形波导偏振转换
  • 第九章:了解特殊场景下的redis