标签:控件 assembly qt 编译成 dll qml 模块 test mymodule
简要记录一下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
}
}
标签:控件,assembly,qt,编译成,dll,qml,模块,test,mymodule 来源: https://blog.csdn.net/tlglove326/article/details/117995812
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。