QML——添加自定义模块

一、模块的定义

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

import QtQuick 2.0
import QtSensors 5.0

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

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

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

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

更多介绍,可以参考官方文档:http://doc.qt.io/qt-5/qtqml-modules-topic.html

二、定义一个模块

模块是由一个名为 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,通过以上两步,我们的模块就已经定义好了!

qmldir文件中更多复杂的定义可参考官方文档:点我!

三、使用自定义模块

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

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

import "./CustomControl"

可以参考http://doc.qt.io/qt-5/qtqml-syntax-directoryimports.html中的讲解

另一种方法是使用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中可能不会立即生效,不过重启一下就好了。

方法二:

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

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

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

时间: 2024-12-16 15:15:02

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

linux python 修改环境变量 添加自定义模块路径

举一个很简单的例子,如果你发现一个包或者模块,明明是有的,但是会发生这样的错误: >>> from algorithm import *Traceback (most recent call last):  File "<stdin>", line 1, in <module>ImportError: No module named algorithm 那么就应该是环境变量出问题了 okay,来看怎么搞 >>>>>

python自定义模块

Python可以添加自定义模块 方法一:echo 'export PYTHONPATH='/root/pythondiy/' >> /root/.bashrc # 此目录为你模块的路径 # 然后使用sys模块查看环境变量 import sys sys.path          # 返回一个列表 ['',  '/usr/local/bin',  /root/pythondiy',  '/usr/local/lib/python27.zip',  '/usr/local/lib/python2.

【Nginx】开发一个简单的HTTP模块

首先来分析一下HTTP模块是如何介入Nginx的. 当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... } 事件模块检测是否有TCP连接请求,当收到一个SYN包后,由事件模块建立一条TCP连接.连接建立成功后,交由HTTP框架处理,HTTP框架负责接收HTTP头部,并根据头部信息将

Python3 学习第十一弹: 模块学习四之sys库

sys模块 提供一些与python解释器关系紧密的变量和函数 1> argv 命令行参数 通过命令行可以向python传输参数 2> exit([arg]) 程序退出,可以返回给命令行一个错误参数或返回值 ## test.py ## import sys i = 0 for argv in sys.argv: print('第', i, '个参数: ', argv) i += 1 exit(argv) 3> path 一个存储Python基本源模块的路径的列表,可以自行添加自定义模块路径

匿名函数、内置函数与模块

一.匿名函数 Python使用lambda来创建匿名函数,不再使用def语句这样标准的形式定义一个函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 lambda函数拥有自己的名称空间,且不能访问自有参数列表之外或全局名称空间里的参数 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率 适合临时的一次性的使用场景 语法:

os和sys模块

sys模块 sys模块主要是用于提供对python解释器相关的操作 函数 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.modules.keys() #返回所有已经导入的模块列表 sys.modules #返回系统导入的模块字段,key是模块名,value是模块 sys.exc_info() #获取当前正在处理的异常类,exc_type.exc_value.exc_traceback

[转]软件开发规范—模块开发卷宗(GB8567——88)

做软件开发是有那么一套国准可参照的,当然就是那些文档了,这里列出一下所有软件开发的规范文档: 操作手册 用户手册 软件质量保证计划 软件需求说明书 概要设计说明书 开发进度月报 测试计划文档 测试分析报告 数据库设计说明书 软件配置管理计划 模块开发卷宗 详细设计说明书 项目开发总结报告 我现在再做的东西是数据库设计说明书,两天前才写玩模块开发卷宗,那时候在网上找了一些事例不是很符合规范,而完全对着模块开发卷宗的模板去写真不知道里面要写什么,因为里面有太多概念性的东西都看不懂,在这里贴以下广佛都

python 模块知识

sys模块 sys模块主要是用于对python解释器相关操作 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.modules.keys() #返回所有已经导入的模块列表 sys.modules #返回系统导入的模块字段,key是模块名,value是模块 sys.exc_info() #获取当前正在处理的异常类,exc_type.exc_value.exc_traceback当前处理的异

Python入门基础知识点(模块)

常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到python解释器的内置模块 为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py