Qt QML - qmldir使用方法详解

以实际例子看qmldir的使用

  • 1.搞一个qmldir
  • 2.让QML找到你的qmldir (重点)
    • .pro 工程文件
    • QQmlApplicationEngine加载主QML处
  • 3.用起来你的模块

qmldir是Qt QML模块化的基石,其设计初衷是为解决QML文件的组织、复用和依赖管理问题,。只需要在每个文件夹内部搞一个qmldir,在任意qml里import之,就能随意使用这个qmldir下的任何qml文件啦,模块化管理还是很方便的

众所周知把大象塞进冰箱只需要三步,所以qmldir的使用也只需要三步:

1.搞一个qmldir

在这里插入图片描述

我一般会在qrc文件处右键新建,你也可以自己安排

我这里项目目录组织是:

根目录
|
|--工程.pro文件
|--interface # 专门存放QML文件
|   |--xxx.qrc
|	|--BarCustom
|       |--qmldir #每个组件目录下一个qmldir!
|		|--StatusBar.qm
|		|--TitleBar.qml
|		|--TopBarDefines.qml
......

注意qmldir的模块名要和该文件夹名一样,方便QML引擎找到qmldir文件
然后在qmldir填入你要声明的内容、暴露出去使用的qml

# 模块名
module BarCustom # 注意要和文件夹名一样!#命名方式: 类名,  版本, 文件名
StatusBar               1.0   StatusBar.qml  
TitleBar                1.0   TitleBar.qml
#QML的单例声明,需要在.qml头部写pragma Singleton
singleton TopBarDefines 1.0 TopBarDefines.qml 

相当于告诉QML引擎,我这里有一个模块叫BarCustom 里面有StatusBar 1.0 版本,TitleBar 1.0版本…


2.让QML找到你的qmldir (重点)

分别需要改两个东西,一个是 .pro 文件,一个是 main主程序入口的QQmlApplicationEngine处调用addImportPath

> QML引擎是根据``{QML_IMPORT_PATH}\文件夹名``去搜索你的qmldir的,比如说你要引用的``BarCustom``的qmldir 路径是:
E:\SoureCode\myProject\interface\BarCustom\qmldir>那你就要让QML知道qmldir搜索路径在:
{QML_IMPORT_PATH}\interface>qrc:/ 也是如此:
qrc:/UI/  # UI/是我工程里创的,因 .qrc文件就在interface/下,所以指的就是interface/,按实际情况来,下面会讲

.pro 工程文件

参考我上面给的目录结构后,填这个即可,如果你的组件文件夹直接在项目根目录,就$$PWD即可

QML_IMPORT_PATH += $$PWD/interface/

QQmlApplicationEngine加载主QML处

这里我是在main.cpp里加载主QML,根据你的实际情况来就行:

QQmlApplicationEngine engine;
engine.addImportPath("qrc:/UI/");

值得注意的是这个qrc路径怎么填,因为实际上它是按你实际目录配置走,(如果你是接手别人的项目,那你需要注意这点)
什么意思呢?
比如说我加载某一个qml界面用的是

settingPage.source = "qrc:/UI/Setting/MainSetting.qml"

虽然这时候我实际目录结构里并没有UI/ ,但这个UI/ 是项目管理时加的层级,所以在addimportPath时也要加上该目录

engine.addImportPath("qrc:/UI/");

当然,也可以直接看你的 .qrc 文件是怎么填的,最终目的都是根据文件夹名找到对应qmldir
在这里插入图片描述

这一步如果没填对,会报找不到该模块的,可以用以下方法打印看看模块加载路径:.pro文件 编译窗口打印:
message("QML_IMPORT_PATH: $$QML_IMPORT_PATH").cpp 运行打印:
// 获取并打印QML_IMPORT_PATH
QString importPath = qEnvironmentVariable("QML_IMPORT_PATH");
qDebug() << "QML_IMPORT_PATH:" << importPath;

似乎只有engine.addImportPath(“qrc:/UI/”);有效,pro文件里就算指定了所在的绝对目录,都不行,还是说我配置有误?欢迎评论区指正一起进步


3.用起来你的模块

在要使用的qml里添加 import xxxxx(模块名) 1.0(版本号)即可。
如:

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import BarCustom  1.0  //xxxxx(模块名) 1.0(版本号)  都是你qmldir声明的内容

就可以愉快使用你模块下声明的任意一个qml啦

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import BarCustom 1.0 Rectangle {color: TopBarDefines.subColorStatusBar{//...}TitleBar{//......}
}/**********我qmldir的内容:***********/
//定义模块名
module BarCustom # 注意要和文件夹名一样!//命名方式: 类名,  版本, 文件名
StatusBar               1.0   StatusBar.qml  
TitleBar                1.0   TitleBar.qml
//QML的单例声明,需要在.qml头部写pragma Singleton
singleton TopBarDefines 1.0 TopBarDefines.qml 
/***********************************/

当然,每次新添文件后,我都习惯重新构建一次,这样能确保编译到位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# Shell脚本参数设计规范(DeepSeek指导)

Shell脚本参数设计规范&#xff08;DeepSeek指导&#xff09; 文章目录 Shell脚本参数设计规范&#xff08;DeepSeek指导&#xff09;A 我问&#xff1a;Q DeepSeek回答&#xff1a;**命令行参数表示规范****标准化表示示例**情况1&#xff1a;必选选项参数值情况2&#xff1a;…

MQTT协议:IoT通信的轻量级选手

文章总结&#xff08;帮你们节约时间&#xff09; MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP&#xff0c;其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…

数据结构——反射、枚举以及lambda表达式

1. 反射 Java的反射&#xff08;reflection&#xff09;机制是在运⾏时检查、访问和修改类、接⼝、字段和⽅法的机制&#xff1b;这种动态获取信息以及动态调⽤对象⽅法的功能称为java语⾔的反射&#xff08;reflection&#xff09;机制。 用途 1. 框架开发 2. 注解处理 3.…

C语言教程(十):C 语言函数详解

一、引言 在 C 语言中&#xff0c;函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数&#xff0c;不仅能提高代码的可读性、可维护性&#xff0c;还便于代码的复用。无论是简单的数学计算&#xff0c;还是复杂的系统操作&#xff0c;函数都发挥着核心作用。…

力扣面试150题--有效的字母异位词和字母异位词分组

Day 24 题目描述 思路 初次思路&#xff1a;如果两个字符串为异位词&#xff0c;说明它们长度相同并且字母出现的次数相同&#xff0c;于是有以下做法&#xff1a; 定义一个map&#xff0c;来保存s中每个字符的出现次数处理特殊情况&#xff0c;如果长度不同&#xff0c;直接…

数理逻辑(Mathematical Logic)综论与跨学科应用

李升伟 整理 数理逻辑&#xff08;Mathematical Logic&#xff09;是现代逻辑学与数学交叉的核心学科&#xff0c;以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑&#xff1a; 1. 核心分支 命…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…

泛型算法——只读算法(一)

在 C 标准库中&#xff0c;泛型算法的“只读算法”指那些 不会改变它们所操作的容器中的元素&#xff0c;仅用于访问或获取信息的算法&#xff0c;例如查找、计数、遍历等操作。 accumulate std::accumulate()是 C 标准库**numeric**头文件中提供的算法&#xff0c;用于对序列…

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

健康养生:开启活力生活的密钥

当我们在健身房看到年逾六旬却身形矫健的老人&#xff0c;在公园偶遇精神矍铄、步伐轻快的长者&#xff0c;总会惊叹于他们的健康状态。其实&#xff0c;这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学&#xff0c;而是融入生活细节的智慧。​ 在饮食的世界…

Linux信号三部曲:产生机制、处理方式与内核接口

Linux系列 文章目录 Linux系列前言一、背景知识铺垫1.1 信号的基本概念1.2 进程对信号的处理 二、信号的产生2.1 前台进程和后台进程2.2 键盘组合键2.3 kill 命令2.4 系统调用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 总结 前言 Linux中&#x…

win7/win10/macos如何切换DNS,提升网络稳定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系统切换DNS&#xff0c;以提升系统的稳定性&#xff0c;获得更好的操作体验。 Windows10及Windows8.1 1、右键单击“此计算机”&#xff0c;然后选择“属性”。进入Windows系统界面后&#xff0c;选择左侧的“…

移动硬盘突然打不开紧急救援指南:从排查到完整恢复‌

突发状况的典型特征‌ 当移动硬盘突然打不开时&#xff0c;用户常会遇到多种异常表现&#xff1a;接入电脑后硬盘指示灯虽亮但无法识别、系统反复提示“设备未连接成功”或弹出“磁盘结构损坏”的警告。部分情况下&#xff0c;资源管理器中的盘符虽可见&#xff0c;但双击后显示…

华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《统计匹配…

半导体制造如何数字化转型

半导体制造的数字化转型正通过技术融合与流程重构&#xff0c;推动着这个精密产业的全面革新。全球芯片短缺与工艺复杂度指数级增长的双重压力下&#xff0c;头部企业已构建起四大转型支柱&#xff1a; 1. 数据中枢重构产线生态 台积电的「智慧工厂4.0」部署着30万物联网传感器…

[Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL

本文内容组织形式 总结具体例子执行语句解析层优化层物理计划层执行层 猜你喜欢PS 总结 先写个总结&#xff0c;接下来会分别产出各个部分的源码解析&#xff0c;Spark SQL主要分为以下五个执行部分。 具体例子 接下来举个具体的例子来说明 执行语句 SELECT name, age FR…

【数据结构】4.单链表实现通讯录

在上一篇文章我们学会了用单链表来实现各种方法&#xff0c;在这一篇文章我们将在单链表的基础上实现通讯录。 0、准备工作 实现通讯录之前&#xff0c;我们还需要在单链表的基础上添加2个文件&#xff0c;头文件Contact.h和源文件Contact.c。Contact.c来实现通讯录方法的声明…

【bash】.bashrc

查看当前路径文件数量 alias file_num"ls -l | grep ^- | wc -l"查看文件大小 alias file_size"du -sh"alias ll alias ll"ls -ltrh"cd的同时执行ll alias cdcdls; function cdls() {builtin cd "$1" && ll }自定义prompt…

微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车

阶段 2 – 购物车&#xff08;超详细版&#xff09; 目标 把“加入购物车”做成 全局状态&#xff0c;任何页面都能读写在本地 持久化&#xff08;关闭小程序后购物车仍在&#xff09;新建 购物车页&#xff1a;数量增减、总价实时计算、去结算入口打 Git Tag v2.0‑cart 1. …

从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)

在数据结构的世界里&#xff0c;红黑树一直以「自平衡二叉查找树」的身份备受赞誉。凭借红黑节点的精妙设计&#xff0c;它能将插入、删除、查找的时间复杂度稳定控制在 ( log ⁡ n ) (\log n) (logn)&#xff0c;成为处理有序数据的经典方案。然而&#xff0c;当业务场景对「…