QML- 导入库包语法

news2024/11/27 19:35:05

QML- 导入库包语法

  • 一、概述
  • 二、Import语句的语法
    • 1. Module (namespace) 模块(命名空间)导入
      • 1. 非模块命名空间的导入
      • 2. 导入到限定局部命名空间
    • 2. 路径 import
      • 1. 本地目录导入
      • 2. 远程目录
    • 3. JavaScript资源导入
  • 三、QML导入路径
  • 四、调试

一、概述

import 语句其实在QML文档里面体现的就是首部位置,和其他编程语言类似,import 语句允许客户端告诉引擎QML文档中使用了哪些模块、JavaScript资源和组件目录。文档中可能使用的类型取决于文档导入了哪些模块、资源和目录。

也很像 C++ 里面的 #include<xxx.h> 引入什么资源之类的。

二、Import语句的语法

qml 里面 有三种不同类型的导入。每种导入类型的语法略有不同,适用于不同导入类型的语义也不同。

1. Module (namespace) 模块(命名空间)导入

最常见的导入类型是模块导入。客户端可以导入QML模块,这些模块将QML对象类型和JavaScript资源注册到给定的命名空间中。
模块导入的一般形式如下:

import <ModuleIdentifier> <Version.Number> [as <Qualifier>]
  • < ModuleIdentifier> 是一个以点分URI表示法指定的标识符,唯一地标识模块提供的类型命名空间。
  • <Version.Number> 是MajorVersion.MinorVersion 形式的一个版本。\指定导入后将提供的各种对象类型和JavaScript资源的定义。
  • < Qualifier> 是一个可选的局部命名空间标识符,模块提供的对象类型和JavaScript资源将被安装到其中。如果省略,则模块提供的对象类型和JavaScript资源将安装到全局命名空间中。

一个非限定模块导入的例子如下所示:

import QtQuick 2.0

这个导入允许使用QtQuick模块提供的所有类型,而不需要指定限定符。例如,创建矩形的客户端代码如下所示:

import QtQuick 2.0

Rectangle {
      width: 200
      height: 100
      color: "red"
}

一个符合条件的模块导入示例如下:

import QtQuick 2.0 as Quick

此导入允许同时导入提供冲突类型名称的多个模块,然而,由于导入到限定命名空间的模块所提供的类型的每次使用都必须在限定符之前,这样QML引擎能够明确解决冲突。

下面是一个客户端代码示例,它在使用符合条件的模块导入后创建一个矩形:

import QtQuick 2.0 as Quick

Quick.Rectangle {
      width: 200
      height: 100
      color: "red"
}

有关限定导入的更多信息,请参见即将介绍 导入限定局部命名空间 的部分。

请注意,如果QML文档没有导入提供特定QML对象类型的模块,但试图使用该对象类型,则会发生错误。 这个就像C++里面没有包括头文件就引入了资源。

例如,下面的QML文档没有导入QtQuick,因此尝试使用Rectangle类型将失败:

Rectangle {
      width: 200
      height: 100
      color: "red"
}

在这种情况下,引擎将发出错误并拒绝加载渲染文件。

1. 非模块命名空间的导入

其他类型也可以通过c++中的各种注册函数(如qmlRegisterType())直接注册到命名空间中。以这种方式注册到命名空间中的类型,可以通过导入命名空间来导入,就像该命名空间是模块标识符一样。
这在客户端应用程序中最常见,它们用c++定义自己的QML对象类型,并手动将它们注册到QML类型系统。

2. 导入到限定局部命名空间

import语句可以使用 as 关键字指定将类型导入特定的文档局部命名空间。如果指定了命名空间,那么对导入可用的类型的任何引用都必须以本地命名空间限定符作为前缀。

下面,QtQuick模块被导入命名空间 “CoreItems”。现在,任何对 QtQuick 模块类型的引用都必须以 CoreItems 名称为前缀:

import QtQuick 2.0 as CoreItems

CoreItems.Rectangle {
      width: 100; height: 100

      CoreItems.Text { text: "Hello, world!" }

      // WRONG! No namespace prefix - the Text type won't be found
      Text { text: "Hello, world!" }
}

命名空间充当文件范围内模块的标识符。命名空间不会像属性、信号和方法那样,成为根对象的一个可以在外部引用的属性。

如果需要使用两个名称相同但位于不同模块中的QML类型,则命名空间导入很有用。在这种情况下,这两个模块可以导入到不同的命名空间中,以确保代码引用的类型正确:

import QtQuick 2.0 as CoreItems
import "../textwidgets" as MyModule

CoreItems.Rectangle {
      width: 100; height: 100

      MyModule.Text { text: "Hello from my custom text item!" }
      CoreItems.Text { text: "Hello from Qt Quick!" }
}

请注意,可以将多个模块导入到同一个命名空间中,这与将多个模块导入全局命名空间的方式相同。例如:

import QtQuick 2.0 as Project
import QtMultimedia 5.0 as Project

Project.Rectangle {
      width: 100; height: 50

      Project.Audio {
          source: "music.wav"
          autoPlay: true
      }
}

2. 路径 import

包含QML文档的目录也可以直接导入到QML文档中。这为QML类型提供了一种简单的方法,可以将其分割为可重用的分组:文件系统上的目录。
目录导入的一般形式如下:

import "<DirectoryPath>" [as <Qualifier>]

注意:导入路径是网络透明的:应用程序可以从远程路径导入文档,就像从本地路径导入文档一样简单。请参阅QML文档中有关网络透明性的一般URL解析规则。如果目录是远程的,它必须包含一个目录导入列表qmldir文件,因为如果qmldir文件不存在,QML引擎无法确定远程目录的内容。
<限定符>的语义与模块导入相似,适用于目录导入;有关该主题的更多信息,请参阅前面关于导入到限定局部命名空间的部分。

QML文件的本地目录可以导入,而无需任何额外的设置或配置。也可以导入QML文件的远程目录,但需要存在一个列出qmldir文件的目录。一个本地目录可以有选择地包含一个目录列表qmldir文件,以便定义应该提供给导入该目录的客户端的类型名称,以及指定应该提供给导入者的JavaScript资源。

1. 本地目录导入

本地文件系统上的任何QML文件都可以使用import语句导入本地目录,该语句引用目录的绝对或相对文件系统路径,从而使文件能够使用在该目录中定义的对象类型。

如果本地目录包含一个目录,其中列出了qmldir文件,那么类型将与qmldir文件中指定的类型名称一起可用;否则,它们将使用从QML文档的文件名派生的类型名称。只有以大写字母开头,以’ '结尾的文件名。如果在目录中没有指定qmldir文件,Qml "将作为类型公开。

一个例子
考虑下面的QML项目目录结构。在顶级目录myapp下,在名为mycomponents的子目录中有一组常用UI组件,主应用程序代码在名为main的子目录中,如下所示:

主/应用程序。qml文件可以使用该目录的相对路径导入mycomponents目录,允许它使用该目录中定义的qml对象类型:

import "../mycomponents"

DialogBox {
      CheckBox {
          // ...
      }
      Slider {
          // ...
      }
}

该目录可以导入限定的局部命名空间,在这种情况下,对目录中提供的任何类型的使用都必须限定:

import "../mycomponents" as MyComponents

MyComponents.DialogBox {
      // ...
}

导入本地目录的能力对于应用程序中的组件集和应用程序原型之类的情况很方便,尽管任何导入此类模块的代码必须在模块目录移动到另一个位置时更新其相关的导入语句。如果使用QML模块,则可以避免这种情况,因为安装的模块是使用唯一标识符字符串而不是文件系统路径导入的。

2. 远程目录

如果目录中包含一个列出qmldir文件的目录,也可以从远程位置导入QML文件目录。
例如,如果前一个例子中的myapp目录托管在“http://www.my-example-server.com”,并且mycomponents目录包含一个定义如下的qmldir文件:

CheckBox CheckBox.qml
DialogBox DialogBox.qml
Slider Slider.qml

然后,可以使用远程mycomponents目录的URL导入该目录:

import "http://www.my-example-server.com/myapp/mycomponents"

DialogBox {
      CheckBox {
          // ...
      }
      Slider {
          // ...
      }
}

请注意,当一个文件通过网络导入一个目录时,它只能访问该目录中的qmldir文件中指定的QML和JavaScript文件。
警告:当从远程服务器导入目录时,开发人员应该始终注意只加载来自可信源的目录,以避免加载恶意代码。

3. JavaScript资源导入

可以在QML文档中直接导入JavaScript资源。每个JavaScript资源都必须有一个用于访问的标识符。
JavaScript资源导入的一般形式如下:

import "<JavaScriptFile>" as <Identifier>

请注意,在QML文档中必须是唯一的,这与可应用于模块导入的本地命名空间限定符不同。
模块中的JavaScript资源
通过将标识符定义添加到指定模块的qmldir文件中,Javascript文件可以由模块提供。
例如,如果projects.MyQMLProject.MyFunctions模块用下面的qmldir文件指定,并安装到QML导入路径中:

module projects.MyQMLProject.MyFunctions
SystemFunctions 1.0 SystemFunctions.js
UserFunctions 1.0 UserFunctions.js

客户端应用可以通过导入模块并使用与已声明资源相关联的标识符来导入模块中声明的JavaScript资源:

import QtQuick 2.0
import projects.MyQMLProject.MyFunctions 1.0

Item {
      Component.onCompleted: { SystemFunctions.cleanUp(); }
}

如果模块被导入到文档局部命名空间中,JavaScript资源标识符必须加上命名空间限定符前缀才能使用:

import QtQuick 2.0
import projects.MyQMLProject.MyFunctions 1.0 as MyFuncs
import org.example.Functions 1.0 as TheirFuncs

Item {
      Component.onCompleted: {
          MyFuncs.SystemFunctions.cleanUp();
          TheirFuncs.SystemFunctions.shutdown();
      }
}

有关JavaScript资源的更多信息,请参阅有关在QML中定义JavaScript资源的文档,以及有关如何导入JavaScript资源的更多信息,以及如何从JavaScript资源中使用导入的更多信息,请参阅有关在QML中导入JavaScript资源的深入文档。

三、QML导入路径

当导入一个标识的模块时,QML引擎将在导入路径中搜索匹配的模块。
这个导入路径,由QQmlEngine::importPathList()返回,定义了引擎要搜索的默认位置。默认情况下,这个列表包含:

  • 当前文件的目录
  • QLibraryInfo::Qml2ImportsPath 指定的位置
  • 由 QML2_IMPORT_PATH 环境变量指定的路径
  • 资源中的 qrc:/qt-project.org/imports 路径。

可以通过 QQmlEngine::addImportPath() 或 QML2_IMPORT_PATH 环境变量添加其他导入路径。当运行 qmlscene 工具时,你也可以使用-I选项来添加一个导入路径。

四、调试

在查找和加载模块出现问题时,QML_IMPORT_TRACE环境变量可用于调试。

设置QML_IMPORT_TRACE环境变量以启用QML导入加载机制的调试输出。

例如,对于这样一个简单的QML文件:

import QtQuick 2.3

Rectangle { width: 100; height: 100 }

如果您在运行 QML Scene 或 QML c++ 应用程序之前设置 QML_IMPORT_TRACE=1,您将看到类似于:

QQmlImportDatabase::addImportPath "/qt-sdk/imports"
QQmlImportDatabase::addImportPath "/qt-sdk/bin/QMLViewer.app/Contents/MacOS"
QQmlImportDatabase::addToImport 0x106237370 "." -1.-1 File as ""
QQmlImportDatabase::addToImport 0x106237370 "Qt" 4.7 Library as ""
QQmlImportDatabase::resolveType "Rectangle" = "QDeclarativeRectangle"

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

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

相关文章

Springboot扩展点之SmartInstantiationAwareBeanPostProcessor

前言这是Springboot扩展点系列的第5篇了&#xff0c;主要介绍一下SmartInstantiationAwareBeanPostProcessor扩展点的功能特性、和实现方式。SmartInstantiationAwareBeanPostProcessor与其他扩展点最明显的不同&#xff0c;就是在实际的业务开发场景中应用到的机会并不多&…

机器学习框架sklearn之特征降维

目录特征降维概念特征选择过滤式①低方差特征过滤②相关系数③主成分分析特征降维 0维 标量 1维 向量 2维 矩阵 概念 降维是指在某些限定条件下&#xff0c;降低随机变量&#xff08;特征&#xff09;个数&#xff0c;得到一组“不相关”主变量的过程 注&#xff1a;正是…

微信小程序 java 医生预约挂号答疑问询系统

生预约答疑系统用户端是基于微信小程序端&#xff0c;医生和管理员是基于网页后端。本系统分为用户&#xff0c;管理员&#xff0c;医生三个角色&#xff0c;用户的主要功能是注册登陆小程序&#xff0c;查看新闻资讯&#xff0c;查看医生列表&#xff0c;预约医生&#xff0c;…

【unity细节】关于资源商店(Package Maneger)无法下载资源问题的解决

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐关于资源商店为何下载不了的问题⭐ 文章目录⭐关于资源商店为何下载不了的问题…

鸟哥的Linux私房菜读书笔记:文件系统的简单操作

磁盘与目录的容量 现在我们知道磁盘的整体数据实在superblock区块中,但是每个个别文件的容量则在inode当中记载的. 那在命令行下面该如何显示处这几个数据呢? df:列出文件系统的整体磁盘书用量du:评估文件系统的磁盘使用量(常用在推估目录所占容量)df先来说明一下范例一所输…

网络协议(四):网络互联模型、物理层、数据链路层

网络协议系列文章 网络协议(一)&#xff1a;基本概念、计算机之间的连接方式 网络协议(二)&#xff1a;MAC地址、IP地址、子网掩码、子网和超网 网络协议(三)&#xff1a;路由器原理及数据包传输过程 网络协议(四)&#xff1a;网络互联模型、物理层、数据链路层 目录一、网…

HER2靶向药物研发进展-销售数据-上市药品前景分析

HER2长期作为肿瘤领域的热门靶点之一&#xff0c;其原因是它在多部位、多种形式的癌症中均有异常的表达&#xff0c;据研究表明HER2除了在胃癌、胆道癌、胆管癌、乳腺癌、卵巢癌、结肠癌、膀胱癌、肺癌、子宫颈癌、子宫浆液性子宫内膜癌、头颈癌、食道癌中的异常表达还存在于多…

从0到0.1学习 maven(三:声明周期、插件、聚合与继承)

该文章为maven系列学习的第三篇&#xff0c;也是最后一篇 第一篇快速入口&#xff1a;从0到0.1学习 maven(一&#xff1a;概述及简单入门) 第二篇快速入口&#xff1a;从0到0.1学习 maven(二&#xff1a;坐标、依赖和仓库) 文章目录啥子叫生命周期生命周期详解clean生命周期def…

统计检验(一)// 方差分析

【应用案例】 检验不同组&#xff08;即不同收入者&#xff09;是否存在“品类满意度”显著差异。各组的满足度平均值如下&#xff1a; 【操作步骤】 方差分析的前提条件是各组总体方差没有显著差异。 第一步&#xff1a;方差同质性检验 原假设&#xff1a;没有差异。 结论…

接口测试入门,如何划分接口文档

1.首先最主要的就是要分析接口测试文档&#xff0c;每一个公司的测试文档都是不一样的。具体的就要根据自己公司的接口而定&#xff0c;里面缺少的内容自己需要与开发进行确认。 我认为一针对于测试而言的主要的接口测试文档应该包含的内容分为以下几个方面。 a.具体的一个业…

时间复杂度的计算(2023-02-10)

时间复杂度的计算 时间复杂度的计算分为三大类&#xff1a;一层循环、二层循环和多层循环。 一层循环 1.找出循环趟数t及每轮循环i的变化值 2.确立循环停止的条件 3.得出t与i之间的关系 4.联立两式&#xff0c;得出结果 eg: void fun(int n) {int i0;while (i*i*i<n)i;…

LeetCode刷题模版:292、295、297、299-301、303、304、309、310

目录 简介292. Nim 游戏295. 数据流的中位数297. 二叉树的序列化与反序列化【未理解】299. 猜数字游戏300. 最长递增子序列301. 删除无效的括号【未理解】303. 区域和检索 - 数组不可变304. 二维区域和检索 - 矩阵不可变309. 最佳买卖股票时机含冷冻期310. 最小高度树【未理解】…

测试开发,测试架构师为什么能拿50 60k呢需要掌握哪些技能呢

这篇文章是软件工程系列知识总结的第五篇&#xff0c;同样我会以自己的理解来阐述软件工程中关于架构设计相关的知识。相比于我们常见的研发架构师&#xff0c;测试架构师是近几年才出现的一个岗位&#xff0c;当然岗位title其实没有特殊的含义&#xff0c;在我看来测试架构师其…

产业互联网是对互联网的衍生和进化,也是一次重塑和再造

互联网并不仅仅只是充当撮合和中介的角色&#xff0c;它应当具备更多的功能和意义。只有这样&#xff0c;它的发展才能够真正全面和完善。产业互联网的衍生和出现&#xff0c;正是在互联网进化的基础之上出现的。这是我们看到之所以会有那么多的互联网玩家投身到产业互联网的浪…

FITC-PEG-FA,荧光素-聚乙二醇-叶酸,FA-PEG-FITC,实验室科研试剂,提供质量检测

FITC-PEG-FA&#xff0c;荧光素-聚乙二醇-叶酸 中文名称&#xff1a;荧光素-聚乙二醇-叶酸 英文名称&#xff1a;FITC-PEG-FA 英文别名&#xff1a;Fluorescein-PEG-Folic Acid 性状&#xff1a;基于不同的分子量&#xff0c;呈白色/类白色固体&#xff0c;或粘稠液体。 溶…

第九节 使用设备树实现RGB 灯驱动

通过上一小节的学习&#xff0c;我们已经能够编写简单的设备树节点&#xff0c;并且使用常用的of 函数从设备树中获取我们想要的节点资源。这一小节我们带领大家使用设备树编写一个简单的RGB 灯驱动程序&#xff0c;加深对设备树的理解。 实验说明 本节实验使用到STM32MP1 开…

使用gitlab ci/cd来发布一个.net 项目

gitlab runner的安装和基本使用:https://bear-coding.blog.csdn.net/article/details/120591711安装并给项目配置完gitlab runner后再操作后面步骤。实现目标&#xff1a;master分支代码有变更的时候自动构建build。当开发人员在gitlab上给项目打一个tag标签分支的时候自动触发…

4.5.4 LinkedList

文章目录1.特点2.常用方法3.练习:LinkedList测试1.特点 链表,两端效率高,底层就是链表实现的 List接口的实现类&#xff0c;底层的数据结构为链表&#xff0c;内存空间是不连续的 元素有下标&#xff0c;有序允许存放重复的元素在数据量较大的情况下&#xff0c;查询慢&am…

代码随想录NO39 |0-1背包问题理论基础 416.分割等和子集

0-1背包问题理论基础 分割等和子集1. 0-1背包问题理论基础(二维数组实现)2. 0-1背包问题理论基础 二&#xff08;一维数组实现&#xff09;1. 0-1背包问题理论基础(二维数组实现) 背包问题一般分为这几种&#xff1a; 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w…

51单片机15单片机 时钟芯片DS1302【更新中】

前言 现在流行的串行时钟电路很多&#xff0c;如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便&#xff0c;被广泛地采用。 本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路主要特点是采用串行数据传输&#xff0c;可为掉电…