0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何以模块的方式导入QML目录

工程师邓生 来源:嵌入式小生 作者:嵌入式小生 2022-08-31 09:16 次阅读

开篇

在《如何导入QML文档目录》一文中,描述了如何导入QML目录。对于应用程序内组件集来说,在实际开发中,导入本地QML目录非常方便。但是如果模块目录移动到了另一个位置,那么所有与导入此模块的代码(与导入相关的语句)都必须更新,这将是一个非常麻烦且糟糕的事情。本文将继续该文中留下的话题:如何以模块的方式导入。

使用QML模块的优点如下:

(1)在一个项目中可以共享公共的QML类型。

(2)可用于发布基于QML的库。

(3)可以模块化开发,使应用程序只加载各自需要的库。

(4)可以对QML类型和资源进行版本控制,这样可以很容易的更新模块。

从0到1

创建一个工程

首先使用QtCreator创建一个工程,这里命名为:CusModule,工程目录结构如下图所示:

0646f99e-28c7-11ed-ba43-dac502259ad0.png

上图中,有一个描述qml应用的main.qml文件,还有一个main.cpp文件用于描述一个Qt应用,并创建QGuiApplication应用和QQmlApplicationEngineqml解析引擎。

创建模块

假如我们需要创建一个模块,将该模块命名为CusComponent,该模块里包含一组qml文件:MyRect10.qml、MyRect20.qml、MyText10.qml、MyRect30.qml文件。

在文件中分别写上以下简单的代码:

//MyRect10.qml
importQtQuick2.0

Rectangle{
height:50
width:50
color:"blue"
}
//MyRect20.qml
importQtQuick2.0

Rectangle{
height:50
width:50
color:"red"
}
//MyRect30.qml
importQtQuick2.0

Rectangle{
height:50
width:50
color:"black"
}

//MyText10.qml
importQtQuick2.0
importQtQuick.Controls1.4

Label{
text:qsTr("iriczhao|自定义QML模块");
}

接着在CusComponent目录下添加一个qmldir文件,注意该文件名只能是qmldir,在该文件中放入以下代码:

moduleCusComponent
CusMyRect1.0MyRect10.qml
CusMyText1.0MyText10.qml
CusMyRect2.0MyRect20.qml
CusMyRect3.0MyRect30.qml

qmldir文件是一个纯文本文件,该文件内容由命令组成,用于描述组成该模块的文件和'资源。语法如下(此处只列出两条命令):

module

该命令用于声明模块的模块标识符,是模块的标识符,它必须与模块的安装路径匹配。模块标识符指令必须位于qml文件的第一行。

[singleton]

该命令用于声明模块可用的QML对象类型。

『singleton』用于声明单列类型,该参数可选。

『TypeName』可用的类型名称。

『InitialVersion』可用类型对应的模块版本。

『File』是定义类型的QML文件的(相对)文件名。

qmldir文件中可以存在零个或多个对象类型声明,但是每个对象类型在模块的特定版本中必须有一个唯一的类型名称。

完成后目录结构如下:

066bbe3c-28c7-11ed-ba43-dac502259ad0.png

在QtCreator中的目录结构如下图所示:

0686a1ac-28c7-11ed-ba43-dac502259ad0.png

注,qmldir文件也要添加到资源管理中。

导入模块

在main.qml文件中使用import语言导入模块,语法如下:

import模块名版本号

本文则使用import CusComponent 1.0导入,然后我们设计一个简单的界面显示,完整代码如下:

importQtQuick2.15
importQtQuick.Window2.15
importQtQuick.Controls2.15

importCusComponent1.0

Window{
width:640
height:480
visible:true
color:"#89c3f6"
title:qsTr("HelloWorld")

//MyRect10.qml
CusMyRect{}

//MyText10.qml
CusMyText{
x:200
y:10
}
}

这时候,在QtCreator代码编辑器中,我们可以看见几个错误的地方:

06a0e260-28c7-11ed-ba43-dac502259ad0.png

接着,我们运行一下程序,将会报错:module "CusComponent" is not installed

06c5ab0e-28c7-11ed-ba43-dac502259ad0.png

出现这三个问题的原因提示已经很明显啦:那就是模块没有安装,接下来让我们来安装模块啦。

安装模块

当我们的模块设计好后,需要安装。安装的本质就是将QML的解析路径告诉QtCreator和QML解析引擎。

(1)将QML的解析路径告诉QML解析引擎 这一点,使用qputenv(模块路径)或addImportPath(模块路径)函数实现,在本文中,如果使用qputenv,则需要在main()函数的开始处添加如下代码:

qputenv("QML2_IMPORT_PATH",":/");

如果使用addImportPath(),则需要在QML解析引擎下添加如下代码:

06e238e6-28c7-11ed-ba43-dac502259ad0.png

注,上述路径是相对于资源系统的,

我们可以使用QQmlApplicationEngine的importPathList()函数查看当前QML解析引擎导入的路径都包含了哪些,是否包含了我们需要的模块路径。

好啦,至此,我们已经将QML的解析路径告诉了QML解析引擎。这时候,应用软件是可以启动运行了,如下图所示:

0707effa-28c7-11ed-ba43-dac502259ad0.png

但是,QtCreator代码编辑器中的问题依然存在:QML module not found(CusComponent)和对象类型不高亮显示。这时候,还需要我们将QML的解析路径告诉QtCreator:在.pro工程描述文件中,添加如下代码:

072d68b6-28c7-11ed-ba43-dac502259ad0.png

即可解决。

注意:路径与在QML的解析路径告诉QML解析引擎时设置的路径相同

备注

(1)在设置导入模块路径时需要注意路径的写法,例如,如果本例写成/CusComponet是无法正确安装模块的。这一点,我们可以理解成:QML模块是需要一个模块名的,在写模块导入路径时,写到模块名上一级目录就可以了,不能写到模块名,本文模块名则是:CusComponet。

(2)编写模块描述文件qmldir时,是可以指定qml组件类型的版本号的,这一点则是创建QML模块的一个重要优点,例如,如果将本文的模块导入语句改成:import CusComponent 2.0,就会报:CusMyText is not a type信息了且应用无法启动运行。(模块的版本控制将在后续文章中写到啦)

(3)在QtCreator中,如果导入语句语法和用法都正常,且能正常启动运行qml程序,但是在代码编辑器中依然会报:QT Unknown component(M300)错误。

这是因为QtCreator的代码模型没有重置更新。可按照下列步骤解决:

依次点击:工具 --> QML/JS --> 重置代码模型,重置更新一下代码模型即可解决。

0757412c-28c7-11ed-ba43-dac502259ad0.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编辑器
    +关注

    关注

    1

    文章

    788

    浏览量

    30181

原文标题:从0到1如何创建一个QML模块

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    5.0V参考二极管LM136A-5.0QML LM136-5.0QML数据表

    电子发烧友网站提供《5.0V参考二极管LM136A-5.0QML LM136-5.0QML数据表.pdf》资料免费下载
    发表于 04-08 09:27 0次下载
    5.0V参考二极管LM136A-5.0<b class='flag-5'>QML</b> LM136-5.0<b class='flag-5'>QML</b>数据表

    何以HAE(谐波分析引擎) 方式改善智能电网的集成度

    电子发烧友网站提供《如何以HAE(谐波分析引擎) 方式改善智能电网的集成度.pdf》资料免费下载
    发表于 11-28 11:48 0次下载
    如<b class='flag-5'>何以</b>HAE(谐波分析引擎) <b class='flag-5'>方式</b>改善智能电网的集成度

    如何用import导入一个包

    在Python中,import语句用于导入代码所需的模块或包。模块是Python代码的集合,而包是包含模块和其他包的文件夹。在本文中,我将详细说明如何使用import语句
    的头像 发表于 11-22 14:59 428次阅读

    python如何import自己的模块

    在 my_module 目录下,我们有 __init__.py 文件和两个模块文件: module1.py 和 module2.py 。 要导入 my_module 模块,我们可
    的头像 发表于 11-22 14:57 306次阅读

    Python怎么导入math模板

    在Python中使用math模块需要先导入模块。math模块提供了许多数学函数和数值常量,可以在数学计算和统计分析等方面派上用场。下面将详细介绍如何
    的头像 发表于 11-22 14:49 784次阅读

    python如何导入模块

    中。本文将详细介绍Python中模块导入的相关知识,并举例演示常见的导入方式和用法。 首先,我们需要明确一些基本的概念。Python 的模块
    的头像 发表于 11-22 14:46 530次阅读

    Python import Hook 实现远程导入模块

    所谓的模块 导入,是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用。 也许你看到这个标题,会说我怎么会发这么基础的文章? 与此相反。恰恰我觉得这篇文章的内容可以算是 Py
    的头像 发表于 11-02 11:45 349次阅读
    Python import Hook 实现远程<b class='flag-5'>导入</b><b class='flag-5'>模块</b>

    SNP Glue:SAP数据导入到其他系统的多种方式

    智能。本文将介绍几种常见的方式,帮助企业了解如何将SAP数据导入到其他系统中。  批量导出与导入:  通过SAP的数据导出功能,可以将数据以批量方式导出为常见的数据格式,如CSV、Ex
    的头像 发表于 10-07 09:20 331次阅读

    如何通过Cdd导入方式添加诊断帧

    Cdd导入方式添加诊断帧 实际项目时,车厂或者Tier1会输入cdd文件,集成了所有用到的诊断命令。 通过cdd发送诊断帧的方式如下 导入cdd文件 cdd
    的头像 发表于 09-13 17:22 706次阅读
    如何通过Cdd<b class='flag-5'>导入</b><b class='flag-5'>方式</b>添加诊断帧

    Python导入包操作和本质

    导入包操作和本质 常见方式如下: import a.aa.module_AA : 按模块路径导入 在使用时,必须加完整名称来引用. 比如: a.aa.module_AA.fun_AA(
    的头像 发表于 09-12 17:41 692次阅读

    如何实现__import__()动态导入

    import () 动态导入 import 语句本质上就是调用内置函数 import (),我们可以通过它实现动态导入 实操代码: 使用 import () 动态导入指定的模块
    的头像 发表于 09-11 17:38 748次阅读

    rom…import导入代码介绍

    rom…import导入 基本语法格式如下: from 模块名 import 成员1,成员2,… 如果希望导入一个模块中的所有成员,则可以采用如下
    的头像 发表于 09-11 17:35 677次阅读

    import模块导入方法

    import 语句的基本语法格式如下: import 模块名 # 导入一个模块 import 模块1,模块2… #
    的头像 发表于 09-11 17:31 796次阅读

    何以不同的速率闪烁2个LED

    电子发烧友网站提供《如何以不同的速率闪烁2个LED.zip》资料免费下载
    发表于 07-11 17:06 0次下载
    如<b class='flag-5'>何以</b>不同的速率闪烁2个LED

    QML加载模块 WebView 与C++代码通信控制WebView模块的隐藏与显示

    QML 中的 WebView 模块是用于在应用程序中嵌入 Web 内容的模块。它提供了一个 WebView 组件,可以通过载入 URL 或 HTML 内容来显示 Web 页面。
    的头像 发表于 05-23 09:12 1996次阅读