Qt QML的插件(Qt Quick 2 Extension Plugin)方法

Qt Quick的插件方法

  • 序言
  • 环境
  • 前置注意
  • 概念——Qt Quick插件的相关知识
    • 模块名的相关知识
      • 模块名本身注意事项
      • 模块名版本注意事项
  • 以示例来说明
    • 创建插件
      • qmltypes的生成
        • qmltypes的可能性失效
    • 插件的编码注意
      • 1、插件模块版本控制
      • 2、pro里的注意
    • 调用插件
      • 插件信息输入

序言

网上有很多的Qt Quick扩展插件方法,比如龚建波或者诺谦的,可是好像是教了怎么做,可是还是按着做时还是出现了一些问题,对于新手不太友好,不够简单和全面,起码我看着没有第一时间弄出来,还花了不少时间研究才最终弄出来。

因此我作为更新手的视角也来写一下插件的用法,以供学习的人分别参考。

如果有兴趣,我后面也可以出C++的插件方法,不过感觉资料很多没什么必要。

环境

Qt5.15(MSVC2019)
VS2019

前置注意

示例插件名: TestQmlPlugin
模块名:QmlEditorStyle
插件库名:TestQmlPlugin

概念——Qt Quick插件的相关知识

Qt的插件,有一个很大的特点,就是不需要lib文件,只需要dll文件,就可以进行动态装载。

如果是C++,会需要QPluginLoader进行加载,不过其实也是用的QLibrary。

QML不需要自己来加载,因为Engine已经负责了这个加载任务。

不过相对的,Qt Quick也需要一些信息,比如插件的外接接口的信息,我们提供的就是一个名为:qmldir 的文件,无.txt,.pri那些后缀,就叫qmldir
在这里插入图片描述

关于qmldir里面该怎么写,Qt的助手就已经有相关说明:

在这里插入图片描述

具体有什么可以自行翻找查阅,但是qmldir最起码需要两条信息,也是我演示用的其中两条:
在这里插入图片描述
在这里插入图片描述
一个交代了QML的import时的模块名,另一个交代了插件库的库名。
举例:
qmldir文件里只有两行信息:

module QmlEditorStyle
plugin TestQmlPlugin

而其分别影响的是:

module QmlEditorStyle
->

import QmlEditorStyle 1.0

.
plugin TestQmlPlugin
->
TestQmlPlugin.dll
TestQmlPlugind.dll
.

模块名的相关知识

Qt Quick的import模块名,值得注意的是,其代表的其实是文件夹名,什么意思呢?
比如说QtQuick.Window 2.15这个import的模块,实际代表的是QtQuick文件夹里的Window.2文件夹
在这里插入图片描述

Creator会根据这个,从路径信息里找到对应的文件夹,找到对应的plugins.qmltypes文件和qmldir文件,进而读取进来。
在这里插入图片描述

模块名本身注意事项

有的人可能要自己定义一个插件库,比如说:[公司名].[库名]
然后就打算这样命名文件夹:Company.TestQmlPlugin

这样是行不通的,Creator会找不到插件库的,你得改成 Company文件夹里放TestQmlPlugin文件夹

模块名版本注意事项

那么如果说我们导入示例插件TestQmlPlugin呢?

比如说import TestQmlPlugin 1.0
就直接是TestQmlPlugin文件夹里放就行,后面的.1可加可不加,没有会默认按.1处理

如果是import TestQmlPlugin 2.0
就需要命名为:TestQmlPlugin.2文件夹,这个不能缺少后面的.2

.
另外还需要一个文件,plugins.qmltypes,其提供给Creator提示信息,是由我们用qmlplugindump生成的,或者qmake的里面设置一些东西可以自动生成。

基本这些加上库文件就组成了一个插件。
在这里插入图片描述

以示例来说明

创建插件

在这里插入图片描述

按选择,创建插件的这个工程名,与提供出来的插件名不影响
在这里插入图片描述
选择qmake还是cmake进行编译,Qt6只运行用cmake,如果用QML,以后考虑用Qt6的,就选择cmake。
但是呢,这里现在暂时只讲解qmake方法,cmake待后续添加。
在这里插入图片描述
接下来选择一些基本信息,如最低Qt版本这些,URI的com.mycompany.qmlcomponents,可以改为我们示例用的模块名QmlEditorStyle,或者你打算设置的模块名。
在这里插入图片描述
.
在这里插入图片描述
.
在这里插入图片描述
如此就生成了初始的插件
在这里插入图片描述
进行构建,就可以生成debug版本或者release版本这些的dll了。

不需要在意debug版本,dll名是否会因为有个d后缀而影响的问题,Qt在读取的时候会自动判断的了。

将构建好的dll和qmldir放进由模块名为文件夹名的文件夹里。
在这里插入图片描述

qmltypes的生成

在该文件夹的上一级,用cmd输入:

qmlplugindump QmlEditorStyle 1.1 . > .\QmlEditorStyle\plugins.qmltypes

其的输入规则是:
qmlplugindump+空格+[模块名]+空格+[版本]+空格+[模块所在目录]+空格+ > +空格+[要生成的路径]

需要注意的是,[模块所在目录]是指以模块名为文件夹名的文件夹所在目录,即QmlEditorStyle文件夹。
在这里插入图片描述
生成之后会在模块文件夹里即QmlEditorStyle生成一个plugins.qmltypes,是qmlplugindump根据插件里注册的内容,生成的信息。

qmltypes的可能性失效

1、生成了plugins.qmltypes可能是缺少信息的,也可能是我指令有误之类的吧,但是参考别人的也都是相同的。
在这里插入图片描述
注意上方的exports这行信息,在每个MyItem的左边,需要加上模块名QmlEditorStyle/MyItem 1.1

这样才能生效

2、如果上方加上了模块名仍然Creator提示无效,则在qmldir里新增一行:

typeinfo plugins.qmltypes

不过一般来说加不加不影响

3、如果上边的都弄了之后,发现在导入的地方存在一个错误提示
Error 1:1 预计符号numeric literal
这是编码问题,我遇到了,发现plugins.qmltypes是utf-16格式的,于是我转成了utf-8格式的就正常了
.

插件的编码注意

1、插件模块版本控制

Qt Quick的模块版本,是由注册到该版本的项决定是否存在的。

什么意思呢?

testqmlplugin_plugin.cpp里,有个代码

void TestQmlPluginPlugin::registerTypes(const char *uri)
{
	qmlRegisterType<MyItem>(uri, 1, 0, "MyItem");
}

uri代表的是会传入你编写的模块名,比如说该示例是QmlEditorStyle,uri也是这个值。

第二个参数是主版本号,第三个参数是次版本号。

就是import QmlEditorStyle 1.0里的1是主版本号,0是次版本号。

这样将MyItem注册在了1.0这个模块里,1.0就存在了一个MyItem的项。

你如果后面都弄好后平白无故去导入1.1模块也是不存在的,会提示不存在这个模块,因为里面不包含任何项。

2、pro里的注意

TEMPLATE = lib
TARGET = TestQmlPlugin		// 插件的dll名称
QT += qml quick
CONFIG += plugin c++11

TARGET = $$qtLibraryTarget($$TARGET)
uri = QmlEditorStyle		// 代表着模块名,一般用不上

此处如果额外增加下列代码

CONFIG += qmltypes #自动生成 plugins.qmltypes
QML_IMPORT_NAME = TestQmlPlugin
QML_IMPORT_MAJOR_VERSION = 1

就会自动在构建之后产生一个plugins.qmltypes代码了,可以免掉后面再自行命令行用qmlplugindump了。

不过要自行更改QML_IMPORT_MAJOR_VERSION版本,其代表的是主版本号。

.

调用插件

接下来就是怎么去使用我们的插件了

首先,在上文生成插件后,有一个QmlEditorStyle的文件夹。

将这个文件夹放到使用的工程文件下,专门放QML插件的一个文件夹下,我这里是qml文件夹,你也可以命名为DLL或者其他什么的,名字不影响。
在这里插入图片描述

插件信息输入

有两处需要填写插件信息的:
第一处是pro里,有个QML_IMPORT_PATH,增加qml所在路径。

QML_IMPORT_PATH += C:/Project/Qt/build-testQtQML-Desktop_Qt_5_15_2_MSVC2019_32bit-Release/release/qml

我这里放的是生成的目标路径位置,也可以放工程里,是一样的,不影响。

第二处是在main.cpp里,有个engine,调用engine增加插件路径。

QQmlApplicationEngine engine;
engine.addImportPath(QString("%1/qml").arg(app.applicationDirPath()));		// 可以用绝对路径之类的,指向qml文件夹
const QUrl url(QStringLiteral("qrc:/main.qml"));
...

第三处是调用处的qml里:

import QtQuick 2.15
import QtQuick.Window 2.15
import QmlEditorStyle 1.1			// 调用对应的模块

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")


    MyItem {			// 使用默认提供的C++的Item
        width: 100
        height: 100
        fillColor: "red"
    }
}

上边如果import QmlEditorStyle 1.1或者MyItem有报错,则是没有配置好。

如果能正常运行,则是plugins.qmltypes没有弄好。

以上全部都弄好后,应该是这样的:
正常显示无报错
正常显示无报错

在这里插入图片描述
item能正常显示

至此,Qt Qucik的插件方法教程结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

Linux Shell:`awk` 命令

Linux Shell&#xff1a;awk 命令 awk 是一种强大的文本分析工具&#xff0c;广泛用于文本处理、数据提取和报告生成。它使用自己的编程语言来处理文件中的数据。在 Linux Shell 中&#xff0c;awk 命令能够执行复杂的模式匹配、编辑和分析任务。本文将介绍 awk 的基础用法、高…

解锁网络安全新境界:雷池WAF社区版让网站防护变得轻而易举!

网站运营者的救星&#xff1a;雷池WAF社区版 ️ 嘿朋友们&#xff01;今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说&#xff0c;简直就是保护伞&#xff01; 智能语义分析技术&#xff1a;超级侦探上线 先说说为啥我这么稀饭它。雷…

Python项目21:一个简单的记账系统(收入+支出+查询)

------------★Python练手项目源码★------------ Python项目源码20&#xff1a;银行管理系统&#xff08;开户、查询、取款、存款、转账、锁定、解锁、退出&#xff09; Python项目19&#xff1a;学员信息管理系统&#xff08;简易版&#xff09; Python项目18&#xff1a;…

PID控制有物理含义吗

PID控制有物理含义吗 一、背景 对于PID的初学者&#xff0c;经常会有疑惑&#xff0c;为什么位置的误差通过PID就变成了期望速度&#xff1f;他们之间有什么物理关系吗&#xff1f;还有对于无人机&#xff0c;为什么期望升力&#xff0c;又是期望加速度&#xff0c;又是期望油…

DFS(排列数字、飞机降落、选数、自然数的拆分)

注&#xff1a;1.首先要知道退出条件 2.还原现场 典型&#xff1a;全排列 题目1&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[1005],p[1005],v[1005]; int n; void dfs(int x) {//此次dfs结束条件,即搜到底 if(xn1){for(int i1;i&…

多线程代码设计模式之单例模式

目录 设计模式引入 饿汉模式 懒汉模式 单例模式总结 设计模式引入 1.1.什么是设计模式 &#xff08;1&#xff09;设计模式就是一种代码的套用模板。例如&#xff1a;一类题型的步骤分别有哪些&#xff0c;是可以直接套用的。 &#xff08;2&#xff09;像棋谱&#xff…

java对象是怎么在jvm中new出来的,在内存中查看java对象成员变量字段属性值

java对象是怎么在jvm中new出来的 查看java对象字段属性在内存中的值 java 对象 创建 流程 附上java源码 public class MiDept {private int innerFiled999;public MiDept() {System.out.println("new MiDept--------------");}public String show(int data) {Sy…

Python学习之-魔术方法

前言&#xff1a; Python 中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也称作特殊方法&#xff08;Special Methods&#xff09;&#xff0c;是那些被双下划线包围的方法&#xff0c;例如 init。这些方法在 Python 中有特殊的含义&#xff0c;它们并不需要…

(免费分享)基于springboot,vue问卷调查系统

用户注册、用户登录、创建调查问卷、编辑问卷问题和选型&#xff08;支持题型&#xff1a;单选、多选、单行文本、多行文本、数字、评分、日期、文本描述&#xff09;、保存和发布问卷、停止问卷调查、游客填写调查问卷&#xff08;一个IP地址只能填写一次&#xff09; 技术&a…

Adobe After Effects 2024 v24.3 (macOS, Windows) - 后期特效

Adobe After Effects 2024 v24.3 (macOS, Windows) - 后期特效 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD 请…

支持编写任何类型的爬虫:基于 Golang 的优雅爬虫框架 | 开源日报 No.216

gocolly/colly Stars: 21.5k License: Apache-2.0 colly 是 Golang 的优雅爬虫和爬虫框架。 该项目提供了一个清晰的接口&#xff0c;用于编写任何类型的爬虫/抓取器/蜘蛛。Colly 可以轻松从网站中提取结构化数据&#xff0c;可用于数据挖掘、数据处理或存档等各种应用。 其主…

如何把学浪app的视频保存本地

如何把学浪app里面的视频保存到本地&#xff0c;其实很简单&#xff0c;只需要用到一个工具&#xff0c;那就是小浪助手.exe 这里我已经把小浪助手.exe打包好了&#xff0c;有需要得话自己下载 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提…

在线视频教育平台|基于Springboot的在线视频教育平台系统设计与实现(源码+数据库+文档)

在线视频教育平台目录 基于Springboot的在线视频教育平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 用户功能模块 教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&a…

如何在Python中将HTML实体代码转换为文本

在处理HTML数据时&#xff0c;有时会遇到HTML实体代码&#xff0c;这些代码是为了在HTML中表示特殊字符而使用的。例如&#xff0c;<表示小于符号(<)&#xff0c;>表示大于符号(>)&#xff0c;&表示和符号(&)等等。那么当我们在实际操作中可能会遇到下面的…

Centos7使用docker安装Jenkins(含pipeline脚本语句)

一、下载Jenkins docker pull jenkins/jenkins:lts 二、启动Jenkins docker run \-u root \--rm \-d \-p 8081:8080 \-p 50000:50000 \-v /root/docker/jenkins/var/jenkins_home:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr…

初学者也能轻松使用的原型设计工具

原型是之前所有 UX 设计工作的合并&#xff0c;是一种单一、可视、功能的产品&#xff0c;用于验证假设和测试设计。作为产品经理或设计师&#xff0c;原型设计工具是必不可少的合作伙伴。目前网站原型设计中可以使用的工具有很多&#xff0c;比如 Axure、Sketch、XD、Figma 等…

Vue2 —— 学习(一)

目录 一、了解 Vue &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;Vue 特点 &#xff08;三&#xff09;Vue 网站 1.学习&#xff1a; 2.生态系统&#xff1a; 3.团队 二、搭建 Vue 开发环境 &#xff08;一&#xff09;安装与引入 Vue 1.直接引入 2.N…

微信小程序认证,备案,域名,证书,上线全流程

1.微信公众平台完成小程序认证和备案。 配置服务类目&#xff1a; 2.购买域名并完成域名实名认证和备案&#xff0c;公安备案。 3.购买https证书。 下载证书&#xff1a; 4.创建目录 mkdir -p /home/app/exam/ssl。上传证书到该目录下。 5.创建nginx配置文件: vim /usr/local…

09 Python进阶: JSON 数据解析、日期和时间

JSON 数据解析 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码&#xff0c;它包含了两个函数&#xff1a; json.dumps(): 对数据进行编码。 json.loads(): 对数据进行解码。 Python 编码为 JSON …