用QML模块的方式组织软件是个不错的结构设计,笔者的QtQuick项目都会首先考虑QML模块的划分,然后以搭积木的方式完成最后的开发。

Qt Creator是开发QtQuick程序的首先IDE,因为它提供了很方便的代码提示和JS调试。但是笔者发现,项目中经常有成员抱怨自定义模块没有代码提示。这虽然不影响功能,但是却影响开发效率和开发体验。专为QtQuick开发的IDE居然对我们的QML模块一无所知,这没法忍。

这篇文章笔者将围绕这个问题,首先介绍Qt Creator是如何做到QML代码提示的,然后再讲如何让我们的自定义模块也能够支持代码提示。

回顾何为QML模块

QML模块是QML库的基本单元。具体的定义这里不赘述了,只挑几个要点回顾一下:要成为QML模块,必不可少的是两个条件:和模块名一致的文件夹名;

该文件夹下有一个qmldir文件,定义该QML模块的模块名(和文件夹名一致)以及其他的类型、资源。

可以有一个或多个C++编译而成的插件(一般就是一个插件,多了会影响性能);

可以有QML文件和JS文件。

上述都是影响QML模块功能的地方。之前我们开发QML模块时的注意力也在这些地方。但是Qt Creator的代码提示却不靠这个。

qmltypes文件

Qt Creator的代码提示靠的是后缀为qmltypes的文件。大家可以去Qt自带的QML模块看下,每个模块内都有一个qmltypes文件。当我们在QML代码中写下import XXX时,Qt Creator就会去找XXX模块文件夹下的qmltypes文件,然后解析,最后提供代码提示。

要想为我们自定义QML模块提供代码提示,关键是生成这个文件。

这个文件就是个文本文件,你可以打开查看。其实理论上你可以根据语法规则手写这个文件,但显然不是很好的做法。

具体方法

Qt其实自带了一个工具,位于bin目录里的qmlplugindump,是个命令行工具,可以用来生成qmltypes文件。假设模块名叫MyModule,具体过程如下:

1. 正常开发QML模块,编译好后使用windeployqt(MacOS上是macdeployqt)解决依赖。这个deploy工具如何使用请参看本专栏之前的一篇文章:陈锦明:使用CMake自动部署Qt Quick程序​zhuanlan.zhihu.com

2. 确保编译生成的dll和qmldir等放在MyModule文件夹内,而MyModule文件夹和第1步部署后的其他QML模块同一层级,假设都位于c:/deploy。

3. 调用qmlplugindump,基本用法是:qmlplugindump MyModule 1.0 c:/deploy -nonrelocatable -output mymodule.qmltypes,这样就会生成mymodule.qmltypes文件。将其考到MyModule文件夹内即可。同时修改qmldir文件,加上:

typeinfo mymodule.qmltypes

此时我们的MyModule模块就完成了。

4. 在主界面工程中,如果是CMake工程,要在CMakeLists.txt中设置QML_IMPORT_PATH这个变量,而且要确保其写入到CMake Cache中,一般的写法是:

set(QML_IMPORT_PATH ${CMAKE_CURRENT_BINARY_DIR} CACHE STRING "qml import path"

其中,${CMAKE_CURRENT_BINARY_DIR} 是你放置MyModule模块的所在目录,你也可以放在别的地方。

5. 在主界面QML代码中,import MyModule 1.0之后,Qt Creator就能够自动加载对应的qmltypes文件了。

注意事项

笔者在实践中发现几个要注意的地方,列在下面和大家分享:要使Qt Creator正确加载qmltypes文件,请确保QML_IMPORT_PATH设置正确。如果是CMake工程,请确保它写入了CMakeCache.txt文件中。如果没有,可以清楚CMake配置,重新CMake;

Qt的bin目录中自带的是Release版的qmlplugindump,它只能正确处理我们Release版的插件编译结果,对于Debug版的是会报错的。解决办法有两个:只在Release时生成。其实qmltypes文件是一样的,Debug和Release可以复用;

自己去Qt源码中找到qmlplugindump的源码,然后编一个Debug版的。

可以使用CMake的add_custom_command命令将qmlplugindump的执行脚本化,这样可以让CMake每次编译时自动帮我们生成(或者更新)qmltypes文件。

qt自定义插件creator不显示_让Qt Creator更懂我们的自定义模块相关推荐

  1. chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)

    本代码实现的功能: 实时动态双曲线 可以鼠标拖拽 可以保留已经产生的数据 随着鼠标的移动实时显示X.Y轴坐标 在.pro中 QT += charts 在ChartView.h中 #ifndef __C ...

  2. ubuntu下qt模拟键盘按键按下_基于QT的跨平台虚拟键盘设计与实现

    摘  要: 针对QT在Windows.Linux.以及嵌入式Linux-arm等不同平台下没有开源.高效的虚拟键盘(包含中文输入法),以及QT版本升级造成代码不兼容等问题,设计并实现了一个跨平台的虚拟 ...

  3. arm qt mysql插件_Ubuntu下编译ARM平台Qt的MySQL插件

    最近需要将一个程序移植到arm平台上,程序调用了MySQL数据库,所以就牵扯到将MySQL数据库移植到ARM平台上面,所以在网上大量查阅资料.在baidu文库发现了一篇文档,是wlzxlc上传的文档名 ...

  4. qt中drawline函数的参数_在Qt GraphicsView中创建长线(或十字线)光标的最佳方法...

    如果我理解正确,您想绘制水平线和垂直线,在光标位置交叉,并且与视口一样大. 问题是,场景不知道鼠标的位置.这意味着视图必须跟踪它并在鼠标位置发生变化时通知场景. 要做到这一点,您必须创建自己的Grap ...

  5. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....

    1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式 ...

  6. python第三方插件pip是什么_什么是pip,如何安装管理第三方模块

    什么是pip,如何安装管理第三方模块 pip 是python标准库的管理工具,使用它可以安装管理第三方库,本篇教程一篇新手引导教程,通过本篇教程,你可以学会掌握以下几点技能 安装第三方库 在 Pyth ...

  7. Qt Creator添加Qt Designer插件

    Qt Creator添加Qt Designer插件 添加Qt Designer插件 查找Qt Designer插件 在macOS上配置Qt Designer插件 匹配的构建密钥 添加Qt Design ...

  8. 使用zabbix-agent2自定义插件获取https证书过期时间

    需求 对经常维护网站的人来说,要经常跟https的证书打交道.一般https证书的有效期是一年,证书一旦过期,公司的损失会非常大.去年网易邮箱因为https证书忘记续期,导致大量用户无法正常使用邮箱就 ...

  9. Unity使用Package Manager管理自定义插件

    文章目录 前言 一.自定义插件流程 二.嵌入式程序包 1.简介 2.如何在unity中嵌入程序包 总结 前言 本文介绍Unity如何使用的Package Manager去构建自定义插件,主要介绍在开发 ...

最新文章

  1. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
  2. JavaScript基础一
  3. 高等学校计算机规划教程,高等学校计算机应用规划教材:计算机组成原理简明教程...
  4. Linux Shell——-if -eq,if -ne,if -gt[笔记]
  5. Qt工作笔记-通过C++使widgets与QQuick交互(包含qml界面对象与C++对象映射)
  6. HDOJ1800 Flying to the Mars【Hash】
  7. [转载] 学Python的笔记(在网上自学的总结)
  8. WebForms简介
  9. 作业2——需求分析原型设计
  10. 结构体与对象的联系与区别
  11. 7923 consoleconsumer 怎么关闭_英雄联盟手游怎么设置最好 LOL手游最佳设置攻略_英雄联盟手游...
  12. 采购订单模板_金蝶KIS商贸版(采购模块)常见问题汇总
  13. Python实现Mean Shift算法
  14. LeetCode题解:猜数字大小
  15. android edittext过滤空格,关于android:在EditText中拦截空格键的问题
  16. 移动 App 应用测试方法与思路
  17. python数据挖掘入门与实践-第一章-用最简单OneR算法对Iris植物分类
  18. mysql存储过程 根据查询的结果集向表中插入数据
  19. 双语电子书epub格式
  20. 一个屌丝程序员的青春(一九一)

热门文章

  1. matlab向量的模_基于MATLAB使用矩阵方法求解一维定态薛定谔方程
  2. 模拟后台数据,ajax请求,有什么方法可以模拟ajax请求?
  3. php中get_featured_posts()是什么意思,php – 在WP_Query中获取WooCommerce特色产品
  4. shell在手分析服务器日志不愁
  5. c语言贪心算法背包问题_GGTalk 中的算法知识 01背包问题
  6. 桌面鼠标手写输入法_「桌面分享」工作娱乐两不误,花费7万打造的桌面都有些啥?...
  7. list 索引 java_如何在Java中保持List索引的固定
  8. h5页面笔按下默认是拖动_屡屡刷屏的长页面H5原来是这样诞生的
  9. python 修饰器_python中用修饰器进行异常日志记录
  10. vue的route懒加载