做报名网站,内部劵淘网站怎么做,网站开发完了备案,企业网站空间多大Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件qmltypes的生成qmltypes的可能性失效 插件的编码注意1、插件模块版本控制2、pro里的注意 调用插件插件信息输入… Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件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 .
插件里的qml文件
有些人会想将QML文件放进插件里这样调用的时候就可以拿着dll随便用了。
可惜实现不了。
插件本质上是一种特殊的动态库动态库你我都懂如果需要调用动态库里面的类就需要提供一些接口.h文件。
然后编码时才可以自由访问提供的接口类。
同理你要调用QML文件就必须要有接口可怎么提供接口呢QML文件就没有分什么.h文件.cpp文件它是解释型语言就算用插件你也需要提供源码才可以。
除非你用C实现QML的项然后封装进插件里再放出.h文件即可。(因为QML的项本质上是QtC的实现而来的。)
将自己封装好的QML文件放在插件库文件夹里即下文会提到的QmlEditorStyle文件夹里。
再将qmldir文件夹的末尾加上资源标识符 注册的版本 对应文件 其对应的就是
qmlRegisterTypeMySliderItem(QmlEditorStyle, 1, 0, Slider);ResourceIdentifier对应的是Slider注册的QML类型 InitialVersion对应的是1, 0C是1逗号0qmldir是1点0 File对应的是MySliderItem实际的QML文件C的是实际的C类
module QmlEditorStyle
...
Slider 1.0 MySliderItem.qml不过一般都会文件和类型名一致。
这样就算是将QML文件放进插件库里了当调用该文件夹的插件时也会囊括QML文件了。
模块名的相关知识
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)
{qmlRegisterTypeMyItem(uri, 1, 0, MyItem);
}uri代表的是会传入你编写的模块名比如说该示例是QmlEditorStyleuri也是这个值。
第二个参数是主版本号第三个参数是次版本号。
就是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 c11TARGET $$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: 640height: 480visible: truetitle: qsTr(Hello World)MyItem { // 使用默认提供的C的Itemwidth: 100height: 100fillColor: red}
}
上边如果import QmlEditorStyle 1.1或者MyItem有报错则是没有配置好。
如果能正常运行则是plugins.qmltypes没有弄好。
以上全部都弄好后应该是这样的 正常显示无报错 item能正常显示
至此Qt Qucik的插件方法教程结束。