Qt QML - qmldir使用方法详解

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 
/***********************************/

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

一些知识备忘小彩蛋

-想自定义显示的字体? 这段可以用来获取字体的字库名称  ----字库名称必须要对的上才能加载
--在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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值