qt qml控件编译成dll并调用 (VS2017)

简要记录一下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
    }
}

 

上一篇:[ARM-assembly]-ARM64汇编语言学习笔记


下一篇:使用Maven的assembly插件