目的
将自己写的可通用的qml组件打包成dll文件,供其他项目使用。通过生成qmltypes文件实现在qt creator中正常识别,能够自动补全。项目不需要任何多余操作,直接import即可使用。
demo地址
https://github.com/loveCatCoder/ZNModule/tree/master
新建项目
按照如图所示设置新建项目,自定义项目名和保存路径。
编写组件
在项目中编写自定义组件,将组件的qml文件包含在qrc文件中。在插件类的registerTypes成员函数中注册自定义组件。如下图:
void ZNModulePlugin::registerTypes(const char *uri)
{
// @uri ZNModule
Q_INIT_RESOURCE(qml);
int major = 1;
int minor = 0;
qmlRegisterType(QUrl("qrc:/component/ZAvatar.qml") ,uri,major,minor,"ZAvatar");
qmlRegisterType(QUrl("qrc:/component/ZTextButton.qml") ,uri,major,minor,"ZTextButton");
qmlRegisterType(QUrl("qrc:/component/ZCheckBox.qml") ,uri,major,minor,"ZCheckBox");
qmlRegisterType(QUrl("qrc:/component/ZHeader.qml") ,uri,major,minor,"ZHeader");
qmlRegisterType(QUrl("qrc:/component/ZHorizontalMenu.qml") ,uri,major,minor,"ZHorizontalMenu");
qmlRegisterType(QUrl("qrc:/component/ZIconButton.qml") ,uri,major,minor,"ZIconButton");
qmlRegisterType(QUrl("qrc:/component/ZInputField.qml") ,uri,major,minor,"ZInputField");
qmlRegisterType(QUrl("qrc:/component/ZHorizontalMenu.qml") ,uri,major,minor,"ZHorizontalMenu");
qmlRegisterType(QUrl("qrc:/component/ZList.qml") ,uri,major,minor,"ZList");
qmlRegisterType(QUrl("qrc:/component/ZVerticalMenu.qml") ,uri,major,minor,"ZVerticalMenu");
qmlRegisterType(QUrl("qrc:/component/ZIconTextButton.qml") ,uri,major,minor,"ZIconTextButton");
qmlRegisterType(QUrl("qrc:/component/ZTextInput.qml") ,uri,major,minor,"ZTextInput");
}
构建项目
构建项目,找到生成的dll,lib,qmldir,尽量在release模式下构建
生成qmltypes文件
自己找一个地方新建一个文件夹,文件夹名字和qml模块名一致。如ZNModule,将上面的dll,lib,qmldir文件拷贝到ZNModule文件夹中。修改qmldir如下:
#模块名
module ZNModule
#构建项目生成的dll文件名
plugin ZNModule
#项目中继承自QQmlExtensionPlugin的类名
classname ZNModulePlugin
#要生成的类型解释文件的名字
typeinfo plugin.qmltypes
执行命令生成plugin.qmltypes文件
/mnt/f# /mnt/e/Qt/Qt5.13.0/5.13.0/msvc2017_64/bin/qmlplugindump.exe -nonrelocatable ZNModule 1.0 ./ > ./ZNModule/plugins.qmltypes
添加到qt安装目录
将ZNModule文件夹复制到qt安装目录中对应编译器的qml文件夹中,即可在qt creator正常使用,可以自动补全,不会有波浪线。我的目标路径如下,编译器要选对。
E:\Qt\Qt5.13.0\5.13.0\msvc2017_64\qml
参考项目
toou2d组件库
https://github.com/ShowFL/Toou-2D
涛哥博客
https://jaredtao.github.io/2019/06/01/Qml%E7%BB%84%E4%BB%B6%E5%8C%96%E7%BC%96%E7%A8%8B10-%E8%87%AA%E5%AE%9A%E4%B9%89Quick%E6%A8%A1%E5%9D%97/
注意事项
- 提示qmltypes解析错误,error: 预计符号 `numeric literal',原因是qmltypes文件编码不对,修改为utf-8即可。