QML——添加自定义模块

2023-10-27

一、模块的定义

在使用QML时,我们常常看到类似这样的语句:

import QtQuick 2.0
import QtSensors 5.0

通过这些import语句,我们就能使用QML中的相关控件了。

其实这就是导入模块的意思,它包括3个部分:import关键字、模块名称、版本号。

模块是一种封装的方式,设计它的人可以单独更新模块内容,然后更新版本号,对使用模块的人没有影响。在项目中,不同窗口可以使用同一模块中的一些类型。

Qt中已经有很多封装好的模块,我们可以在安装目录里找到:

二、定义一个模块

模块是由一个名为 qmldir 的文件指定的,我们可以打开Qt中模块所在的文件夹看看,每个模块都对应一个qmldir文件:

为了便于理解,我举一个非常简单的例子——

定义一个名为CustomControl(自定义控件)的模块,这个模块里面有一个CustomButton.qml(自定义按钮)文件,也就是一个自定义的名为CustomButton的QML类型。

文件目录结构如下:

下面来分步说明:

1.CustomButton.qml

一个很普通的自定义按钮类型

2.qmldir

每个模块都有一个qmldir文件,在文件中设置模块的名称、指定自定义类型等。比如:

module CustomControl
CustomButton 1.0 ./controls/CustomButton.qml

module <ModuleIdentifier> module关键字,后接模块标识符,每个qmldir文件只能有一个标识符。

[singleton] <TypeName> <InitialVersion> <File> singleton用来声明一个单例类型,它是可省略的。TypeName是类型名称。InitialVersion用来指定版本号。File是QML类型对应文件所在的位置。

以本例来说,类型名是CustomButton,版本号为1.0,文件使用的是相对路径,表示controls文件夹下面的CustomButton.qml文件。

OK,通过以上两步,我们的模块就已经定义好了!

三、使用自定义模块

我们在main.cpp中加载main.qml界面。

第一种方法,可以直接在main.qml中导入qmldir文件所在路径:

import "./CustomControl"

另一种方法是使用QML导入路径,首先看一下main.cpp是如何加载QML文件的:

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

首先定义一个QML引擎engine,然后通过engine传入qml文件。

当导入一个模块时,QML engine将会搜索导入路径 import path 来匹配模块。

可以通过 QQmlEngine::importPathList() 来查看导入路径有哪些:

QQmlApplicationEngine engine;
for(QString path : engine.importPathList())
    qDebug() << path;
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

在我的电脑中,结果如下:

比如,我们平时使用的Qt Quick中的一些控件就在C:/Qt/Qt5.8.0/5.8/msvc2015/qml中。

可以看到,我们需要使用的自定义模块并不在这几个路径中的任意一个中,所以需要如何添加路径呢?

方法一:

使用 QML2_IMPORT_PATH 环境变量来指定模块所在路径,注意QML后面有个2。

在windows系统中,计算机 - 系统属性 - 高级系统属性 - 环境变量

设置完成后,Qt Creator中可能不会立即生效,不过重启一下就好了。

如果不想麻烦地修改电脑设置中的环境变量,我们可以直接在代码中添加:

qputenv("QML2_IMPORT_PATH", "C:/Users/kong/Documents/StyleDemo");

方法二:

在代码中,调用 QQmlEngine::addImportPath() 方法添加路径。

最后,我们的模块就设计成功并能使用了。

上面的例子很简单,更多深刻的地方需要自己在学习和实践中探索

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML——添加自定义模块 的相关文章

随机推荐

  • 集合框架 — ConcurrentHashMap

    集合框架 ConcurrentHashMap 一 ConcurrentHashMap JDK1 7 1 实现结构 2 保证并发安全 分段锁技术 3 put 和 get 方法 二 ConcurrentHashMap JDK1 8 1 实现结构
  • 如何实现网站文件动静分离

    背景 传统动静不分离的产品架构 随着访问量在增长 性能会成为瓶颈 以一个常见的Web站点为例 www acar com是一个刚建立汽车资讯车友交流网站 主站用Php搭建 有10GB的图片素材 部分JS文件 目前购买一台ECS放置所有程序代码
  • 使用Docker安装FastDFS

    1 获取镜像 可以利用已有的FastDFS Docker镜像来运行FastDFS 获取镜像可以通过下载 docker image pull delron fastdfs 也可是直接使用自己下载的镜像备份文件 docker load i 文件
  • HJ103 Redraiment 的走法-最长递增序列

    HJ103 Redraiment 的走法 描述 Redraiment 是走梅花桩的高手 Redraiment 可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替 Redraiment 研究他最多走的步数吗
  • Python基础手册

    目录 第1章 Python环境准备与数据类型 分支结构 1 1 自动化测试介绍与第1个python程序 1 1 1 自动化测试介绍 1 1 2 Python环境准备 1 1 3 什么是解释器 编译型和解释型 1 1 4 第一个Python程
  • 对JSON.parse()中存在转义字符的解决以及js中替换函数replace()的认识

    在工作中 遇到对页面数据进行转存json格式数据后存储在数据库中 然而在显示数据时遇到无法显示json中的数据 产生的bug 问题抛出 1 首先认识下 在JSON parse 将后台传过来的字符串数据转存对象 遇到字符串中带有转义字符 然而
  • 使用Burpsuite进行暴力破解

    Burpsuite是一款Web安全领域的跨平台工具 基于Java开发 它集成了很多用于发现常见web漏洞的模块 如Proxy Spider Scanner Intruder Repeater等 所有模块共享一个能处理并显示HTTP消息的扩展
  • Odoo源码安装

    安装数据库 Odoo 使用 PostgreSQL 作为数据库管理系统 使用您的包管理器下载并安装 PostgreSQL sudo apt install postgresql postgresql contrib 创建用户给odoo连接访问
  • Android开发从入门到精通(3)

    第三章 下载和安装Android SDK 下载和安装Android SDK 第三章 1 关键技能和概念 下载Android SDK 使用Eclipse的可升级特性 为Eclipse下载 安装并配置Android Plugin 检查PATH声
  • 关于Dev c++的简单设置

    一 添加初始源代码 可以在工具 编辑器选项 代码 缺省源中添加初始源代码 这样每次打开软件都会帮你写好C语言必须的几行代码 二 调整代码对齐格式 在格式化选项中可以调整代码格式 我选择了allman风格 默认为Java 在编辑代码时 按住c
  • SA 后缀数组 / SAM 后缀自动机 c++ 模板

    文章目录 前言 代码 1 SA 2 SAM 前言 SA 后缀数组模板 SAM 后缀自动机模板 代码 1 SA include
  • Vue SEO优化之预渲染

    SPA 只有一个html文件的web应用 特点 只有一个html 所有内容在这里展现 html文件只加载一次 用户操作不会让页面重新加载 通过动态更新页面内容的方式呈现不同内容 优 交互好 局部更新 不重新加载 前后端分离 前端页面 后端数
  • 十大人工智能技术

    人工智能通过创新技术改变了我们的生活方式 人工智能在每个行业都掀起了风暴 并对社会的每个部门都产生了深远的影响 人工智能术语一词最早是在1956年的一次会议上创造的 会议的讨论导致了跨学科信息技术自然语言生成学 互联网的出现帮助技术呈指数级
  • 前端开发ps软件及蓝湖的基本使用

    首先 需要先下载蓝湖插件及ps软件 蓝湖官网 https lanhuapp com ps软件 蓝湖使用方法 在官网下载Photoshop插件 并安装 在蓝湖官网注册账号和密码 并登录 下载完成以后 重启ps软件 在 窗口 扩展 蓝湖 打开
  • VUE 在一个组件中引用另外一个组件的两种方式

    下面有两种方法 方法一 代码如下
  • C++图书管理系统,数据结构课程设计(含源码、报告)

    数据结构课程设计 题目 图书管理系统 目 录 一 实验概述 1 1 实验题目 1 2 基本要求 1 3 问题描述 二 详细设计 2 1 数据结构的设计 2 1 1 图书信息的存入 2 1 2 学生信息存入 2 2 算法的设计思想及流程图 2
  • SQLi LABS Less 10 时间盲注

    第十关是双引号字符型注入 推荐使用时间盲注 一 功能分析 二 思路分析 三 解题步骤 方式一 时间盲注 第一步 判断注入条件 第二步 判断长度 第三步 枚举字符 脱库 一 功能分析 二 思路分析 页面无显示位 不适合联合注入 页面不显示数据
  • Git提交代码到别人的仓库——详细版

    1 打开别人的GitHub网址 2 先登录你的账号 显示你的头像的时候再点击Fork 2 1 这是Fork前的 Fork前的是别人的头像 2 2 这是Fork后的 Fork后的是你自己的头像 3 复制这个网址 4 进入你的D盘或U盘 5 右
  • HTML5编写旅游网页

    网页样例 代码 table align center tr td img src images top banner jpg alt td tr table
  • QML——添加自定义模块

    一 模块的定义 在使用QML时 我们常常看到类似这样的语句 import QtQuick 2 0 import QtSensors 5 0 通过这些import语句 我们就能使用QML中的相关控件了 其实这就是导入模块的意思 它包括3个部分