简要记录一下Qt中关于qml编辑的控件编译进dll 供第三方调用的例子
sample地址:https://github.com/tlglovewf/qmldlltest.git (sln是vs2017创建的,其他版本自行修改一下相关工程文件把)
最主要的就是
qml项目中
qmldir :用于定义模块插件基本信息
module test.mymodule //这个表示模块信息(很关键,之后dll路径相关)
plugin qml //导入插件模块的名称
qmlplugin_plugin.h/cpp: 用于导出*.qml文件
class QmlpluginPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char *uri) override;
};
void QmlpluginPlugin::registerTypes(const char *uri)
{
// param QUrl("qrc:/xxxx.qml") 是自定义组件的.qml文件地址
// param 注册到URL
// param 主版本号
// param 次版本号
// param 外部使用的类型名
qmlRegisterType(QUrl("qrc:/QuickMirrorTypes/RedRect.qml") , uri, 1, 0, "RedRect");
qmlRegisterType(QUrl("qrc:/QuickMirrorTypes/BlueRect.qml") , uri, 1, 0, "BlueRect");
}
然后是assembly目录,这个目录就是用于生成可调用模块的目录结构
test/mymodule 这个目录对应之前qmldir中的 test.mymodule
讲qmldir还有编译生成的dll放到这个目录下
目前还不能直接调用这个dll还需要一个module文件的过程
可以查看qml项目中属性->生成事件->后期生成事件
xcopy "$(ProjectDir)QuickMirrorTypes\qmldir" "$(SolutionDir)assembly\test\mymodule\qmldir" /s /y
copy "$(TargetPath)" "$(SolutionDir)assembly\test\mymodule\$(TargetFileName)"
qmlplugindump test.mymodule 1.0 $(SolutionDir)assembly > $(SolutionDir)assembly\module.qmltype
上述两句是为了拷贝文件到指定模块目录下,最后一句则是调用qt的plugindump工具生成模块文件(非常的关键) ps:如果这句生成报错 多半是工具找不到 qt的环境变量没有加到path路径
如果这步生成环境不匹配的问题,可能是你生成了debug的dll 先生成一个release的库然后生成玩qmltype文件之后 再替换debug使用也行
至此打包至dll的工作已经完成 剩下就是调用
直接查看test项目中的main.cpp 即可
主要是下述语句
engine.addImportPath("../assembly");//导入上述生成的模块文件夹
然后就可以调用了
import QtQuick 2.12
import QtQuick.Window 2.12
import test.mymodule 1.0 //引入模块
Window {
visible: true
width: 680
height: 480
title: qsTr("Hello World")
//使用模块中的qml控件
BlueRect
{
x: 20
y: 30
width: 300
height: 100
}
RedRect
{
x: 350
y: 30
width: 300
height: 100
}
}