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.pswp.cn/news/901760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901760.shtml
英文地址,請注明出處:http://en.pswp.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;當業務場景對「…