Qt QML - qmldir使用方法详解

QT Creator快速创建主子项目、pri、qrc、qmldir模块 本文介绍了Qt项目开发中的关键操作:1)创建主项目和子项目;2)通过右键菜单添加子项目;3)多子项目时指定执行程序的方法;4)主项目集成子项目的步骤。重点讲解了.pri文件的作用与创建,它类似于头文件,可集中管理公共配置(头文件路径、库依赖、宏定义等),实现多项目共享。最后说明了为.pri文件创建新程序文件的流程。这些方法能有效提升Qt多项目管理效率。 阅读详情
AI摘要

qmldir是Qt QML模块化的基石,用于解决QML文件的组织、复用和依赖管理问题。其使用分三步:先创建qmldir并填入声明内容;再让QML找到它,需修改.pro文件和主程序入口调用;最后在qml里添加引用即可使用模块,新添文件后建议重新构建。

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 文件是怎么填的,最终目的都是根据文件夹名找到对应qmldir
在这里插入图片描述

我这里稍微特别点,怕带来歧义,解释一下:

  • 我实际目录结构里并没有UI/ ,QML文件都放在/interface下, 这个UI/ 是写上去的层级
  • qrc:/ 指的就是.qrc所在的目录,类似 pro 的$$PWD
    所以实际上qrc:/ 就是类似目录的interface,具体怎么样参考实际工程的qrc ,qmake靠这个来检索文件
这一步如果没填对,会报找不到该模块的,可以用以下方法打印看看模块加载路径:

.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.subColor

    StatusBar{
        //...
    }
	
	TitleBar{
		//......
	}
}


/**********我qmldir的内容:***********/
//定义模块名
module BarCustom # 注意要和文件夹名一样!

//命名方式: 类名,  版本, 文件名
StatusBar               1.0   StatusBar.qml  
TitleBar                1.0   TitleBar.qml
//QML的单例声明,需要在.qml头部写pragma Singleton
singleton TopBarDefines 1.0 TopBarDefines.qml 
/***********************************/

注意,在QT低版本 (如Qt 5.6.3里) ,如果你定义的qmldir 里面有单例,那就要把当前工程里的所有导入该文件夹组件的方式改成import xxx 的形式。即:

早期开发没写qmldir ,用的是相对路径的导入方式:
import "../BarCustom  "
如果你定义了qmldir ,那工程里所有用到该目录下组件的最好都换成
import  BarCustom  1.0
否则会出问题,在低版本中Qt不够智能,会出现导入到QML中的是两份相同的实例,如果是单例,这要出大事!
>

# 一些知识备忘小彩蛋

```cpp
-想自定义显示的字体? 这段可以用来获取字体的字库名称  ----字库名称必须要对的上才能加载
--在windows下,指定字库要addApplicationFont,linux 则指定 $QT_QPA_FONTDIR 即可

// 加载自定义字体文件
int fontId = QFontDatabase::addApplicationFont("....path/to/yours/SourceHanSansCN-Regular.ttf");

// 获取字体族名称
QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);
qDebug() << "  "<<fontName << Qt::endl;

// 设定这个字库
QFont font("Source Han Sans CN Regular");
QGuiApplication::setFont(font);
QML学习四:qmldir及自定义模块使用 若该文为原创文章,转载请注明原文出处 最近接触到一个Qt项目,使用的是QML,项目中应用了大量的自定义模块,涉及qml及qml文件之间的调用,为此,在网上查找了大量资料,发现描述过少,在此,记录自己使用过程. 一、qmldir文件 qmldir文件是一个纯文本文件,用来定义QML模块的。 使用的格式: module 模块名称 #声明模块的模块标识符,必须与模块的安装路径匹配,必须是文件的第一行 #依次为类型名称 | 类型的模块版本 | QML文件名(这里还有可选参数[singlet 阅读详情

相关推荐

[Qt] qmldir文件说明

前沿: 制作Qt插件时会用到qmldir文件,此文件用来描述插件的相关信息,当我们在qml中使用import语句时入股采用 uri 方式导入模块,则需要模块路径下有对应qmldir文件。(另一种import方式为路径导入) 回忆:插件分为两种,一种是c++生成的dll文件,一种是qml文件,这两种插件都需要qmldir来描述,以便import的动作能够正确工作。 module 是指包含 dll lib qml qmldir ... 文件的 “文件夹” , 插件也是一种模块,因此也需要具备qmldir文

ykun089的博客 3428

Qt QML模块化开发:qmldir实战指南与常见问题解析

本文详细解析了Qt QML模块化开发中qmldir文件的核心作用与实战应用。通过创建qmldir文件,开发者可将散乱的QML组件组织成规范模块,实现优雅的import导入。文章手把手指导qmldir的创建、模块定义、路径配置,并深入探讨了版本管理、单例声明、JavaScript与C++插件集成等高级用法,同时提供了模块找不到、类型未定义等常见问题的排查清单与性能优化建议,助力提升QML项目的工程化水平和团队协作效率。

qsc901234567的博客 814

Qt 6实战:利用qmldir为你的QML组件库创建可复用的模块(以Button组件为例)

本文详细介绍了如何在Qt 6中利用qmldir文件创建高复用性的QML组件库,以Button组件为例,涵盖模块化设计、qmldir配置、资源管理、构建系统集成及跨项目使用方案。通过合理的项目结构和版本控制,开发者可以构建专业级UI组件库,显著提升代码复用率和开发效率。

weixin_28713947的博客 103

【QT/QML】qmldir文件作用与用法【未完待续】

qmldir文件作用与用法

Adimecoin的博客 1550

Qt QML项目大了别慌!用qmldir模块化管理的保姆级避坑指南(附QGC地面站实例)

本文详细介绍了如何使用qmldir实现Qt QML项目的模块化管理,解决大型项目中文件混乱、路径复杂等问题。通过QGC地面站实例,展示了模块化架构的优势,包括提升开发效率、降低维护成本等,并提供了从项目结构设计到具体配置的完整指南。

weixin_33728268的博客 116

保姆级教程:在QGC地面站源码中为自定义QML组件创建qmldir模块(附完整配置流程)

本文提供在QGC地面站源码中为自定义QML组件创建qmldir模块的完整教程,涵盖模块化开发的核心概念、qmldir文件配置、QML组件设计原则及工程化集成技巧。通过实例演示如何构建可复用的无人机状态指示器模块,帮助开发者高效扩展QGroundControl功能。

weixin_42542669的博客 331

模块定义qmldir文件

Module Definition qmldir Files 模块定义qmldir文件 There are two distinct types ofqmldirfiles: qmldir文件有两种不同的类型: QML document directory listing files 列出文件的QML文档目录 QML module definition files QML模块定义文件 This documentation covers only the second form ofqml...

aggs1990的专栏 1031

QML模块定义qmldir文件

为了使QML引擎能够正确加载和识别自定义的模块,我们需要定义一个名为"qmldir"的文件。我们将创建一个名为"CustomModule"的模块,并在其中定义一个自定义的QML组件。接下来,我们需要创建一个C++插件库,以便将自定义的QML组件注册到QML引擎中。我们将创建一个名为"CustomModulePlugin"的插件库,并在其中注册我们的组件。通过以上步骤,我们成功地定义了一个QML模块,并在其中注册了自定义的QML组件。首先,让我们创建qmldir文件,并将其放置在我们要创建模块的目录中。

m0_47037246的博客 561

Qt6 QML开发必看:qmldir配置全流程详解(从创建到动态加载路径调试)

本文详细解析了Qt6 QML开发中qmldir文件的核心作用与配置全流程。从模块化基础概念入手,逐步指导如何创建qmldir文件、配置构建系统(CMake/qmake)、集成qrc资源系统,并深入探讨动态路径加载策略与Qt Creator工程调试技巧,帮助开发者彻底掌握QML模块化开发,避免常见‘module not found’错误。

m2n3o4p5的博客 198

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1883

别再拍脑袋估工时了!手把手教你用FPA功能点分析法,给软件项目算笔明白账

本文详细介绍了FPA功能点分析法在软件开发工作量评估中的应用,帮助团队告别拍脑袋估算。通过量化系统功能组件,FPA提供客观的工时和成本预估,特别适合需求不明确的项目初期。文章以财务系统为例,拆解FPA计算流程,并分享实用估算模板,助力技术管理者提升项目规划能力。

weixin_42614269的博客 388

qmldir:QML 模块的“户口本“——从入门到真正理解

摘要:qmldir文件是QML模块的核心配置文件,用于定义模块中的组件类型和单例。文章通过实际项目中的警告案例,揭示了缺少qmldir会导致工具无法正确识别单例(如AppStyle)的问题。即使C++注册能让程序运行,工具仍需qmldir进行静态分析。文中详细讲解了qmldir的语法结构、版本号作用,以及它与pragma Singleton的配合关系,并指出Qt 6.4引入的pragma ComponentBehavior: Bound对代码质量的提升。三者共同构成了现代QML开发的基础规范。

greenspan的专栏 391

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

参考文档1这个工具可以完美替代华硕奥创中心工具,可以定制化不同模式下的CPU、GPU、风扇转速、电池计划等。是由华硕开发人员开发的一个纯绿色的系统管理工具。直接展示启动后的工具界面效果图:这个工具也可以一键式停止正在运行的华硕ASUS服务,减少不必要的资源消耗。

追梦&天空的博客 1万+

别再手动管理QML文件了!用qmldir模块化你的Qt Quick项目(附完整配置流程)

本文详细介绍了如何使用qmldir实现Qt Quick项目的模块化管理,解决QML文件混乱、路径引用复杂等问题。通过清晰的模块化结构和版本控制策略,提升开发效率和团队协作能力,适用于中大型Qt Quick项目。

weixin_28730927的博客 367

问题解决:打开VMware创建的虚拟机,电脑立刻蓝屏并重启

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti

weixin_55118477的博客 3万+

深度学习环境搭建以及DeepLabCut安装过程

文章目录 一、查询电脑硬件 安装GeForce驱动程序 二、环境搭建与软件安装 1.安装CUDA运算平台软件 2.安装cuDNN支持包 3.配置环境变量 三、 DeepLabCut环境配置 1.安装Anaconda 2.创建容器环境 3.激活容器环境 4.安装TensorFlow 5.验证TensorFlow是否安装成功 6...

m0_51136557的博客 3157

Qt 6实战:利用qmldir为你的QML组件库创建可复用的模块(以自定义按钮为例)

本文详细介绍了如何在Qt 6中利用qmldir文件实现QML组件库的模块化管理,以自定义按钮为例展示从设计到分发的完整流程。通过模块化架构,开发者可以有效解决代码冗余、维护困难和版本混乱等问题,提升代码复用率和维护效率。文章还涵盖了CMake集成、资源管理、多环境适配以及企业级部署方案等高级技巧。

weixin_30374009的博客 462

STM32实战开发(71):STM32人脸识别开发教程:基于摄像头模块的人脸识别系统

在嵌入式系统中,STM32凭借其强大的计算性能、丰富的外设接口以及低功耗特性,成为了实现人脸识别系统的理想平台。STM32虽然没有强大的计算能力,但可以通过合理利用外部硬件加速模块,如DSP、GPU、FPGA等,结合轻量级的人脸识别算法,实现高效的人脸识别系统。尽管STM32的计算资源相对有限,但通过合理的优化和使用高效的算法,我们依然能够实现高效的人脸识别功能。在本项目中,我们使用。在STM32开发中,虽然处理能力有限,但通过优化算法和合理利用硬件加速,我们仍然可以实现一个轻量级的、实时的人脸识别系统。

2201_76125393的博客 1662

QGC实战:从零构建qmldir模块的完整工作流

本文详细介绍了在QGC地面站项目中如何从零构建qmldir模块的完整工作流。通过模块化开发,可以有效管理QML文件,提升项目维护效率和编译速度。文章涵盖了qmldir文件编写、QML组件设计、项目资源系统配置以及模块调用等关键步骤,并提供了常见问题解决方案和高级模块化技巧。

weixin_30316097的博客 442

Opencv计算机视觉PPT-算法篇

01 02 03 04 05 06 07 08 09 010 011 012 013 014 015 016 017 018

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 204

YOLOv8改进 | 卷积模块 | 用DWConv卷积替换Conv【轻量化网络】

YOLOv8改进,yolov8,yolov8创新,yolov8涨点

kay_545 7157

避坑指南:QML自定义模块导入失败的5个常见原因及解决方案

本文深入解析了QML开发中自定义模块导入失败的五大常见原因,重点剖析了模块路径配置、qmldir文件规范、版本匹配等核心问题,并提供了详细的排查清单与解决方案,帮助开发者高效定位并解决模块导入难题,提升开发效率。

weixin_29289821的博客 463

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Qt Design Studio 4.1.1 与 Qt Creator 5.15.2 项目集成:3步解决模块导入与信号槽错误

本文详细介绍了如何将Qt Design Studio 4.1.1与Qt Creator 5.15.2项目集成,重点解决模块导入与信号槽错误问题。通过3步操作,包括环境准备、项目结构重构和QML模块路径配置,开发者可以高效完成UI界面设计与业务逻辑的整合,提升开发效率。

congsikuai0611的博客 448

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 在嵌入式板子上搭建和自定义live555服务器---编译问题和方法整理
下一篇: QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配
温柔大猩猩
博客等级 码龄7年 65粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值