Creating C++ Plugins for QML on iOS (static plugin)

11 篇文章 0 订阅
8 篇文章 0 订阅

没写过博客,之前都是伸手党,这个问题在网上实在是没找到解决办法,一直困绕快一年了,前段时间看QtWebView的源码时看到了一线希望,今天有空重新研究QtWebView工程文件,其实还是没有研究透,最多懂了50%,问题虽应该算是解决了,虽然不完美,希望有同学来补充:

1. 插件工程文件 

TEMPLATE = lib #
TARGET = iostestqmlplugin #库名(eg:declarative_webview)
QT += qml quick
CONFIG += qt plugin c++11 static
uri = IosQmlPluginTest # module name 插件模块名(eg:QtWebView, )
QMAKE_MOC_OPTIONS += -Muri=$$uri # 这个是必需的
#其中qml_plugin.prf文件如是描述:
# Insert the plugins URI into its meta data to enable usage
# of static plugins in QtDeclarative:
URI = $$replace(TARGETPATH, "/", ".")
QMAKE_MOC_OPTIONS += -Muri=$$URI

2.qmldir文件:

module IosQmlPluginTest #插件模块名(eg:QtWebView, )
plugin iostestqmlplugin #库名(eg:declarative_webview)
typeinfo plugins.qmltypes #静态插件好像是必需的
classname IosqmlpluginPlugin # classname <C++ plugin class> 静态插件必需的 (eg:classname QWebViewModule)
                             #参考 http://doc.qt.io/qt-5/qtqml-modules-qmldir.html
TimeLabel 1.0 qrc:/TimeLabel.qml # 插件中自己写的qml控件,必需要放到qrc文件中 

 

3.qrc 文件必需要包含上面的 qmldir 文件,而且是要放到的 qrc 文件中以插件模块名结尾的 prefix 中(eg:/qt-project.org/imports/QtWebView,其中”/qt-project.org/imports“是Qt默认的查找 qmldir 的路径,当然也可以自己指定一个路径,但必需在引用的项目中显示指定这个路径,

 

一般是在 main 函数中,如你在 qrc 中创建一个 prefix  "/yourself/prefix/yourself-module-name":

QQmlApplicationEngine engine; 
//其中 yourself-module-name 这个是不用写到这里的,Qt 自己会添加到查找路径里(qml 文件中的import yourself-module-name 1.x,)
engine.addImportPaht("qrc://yourself/prefix"));

 

4. plugins.qmltypes 文件在静态插件库中也是必需的,而且是和 qmldir 文件一起放到插件模块文件夹下面,Qt 默认查找qml查件路径是$$[QT_INSTALL_QML](eg:~\Qt5.9.3\5.9.3\ios\qml\QtWebView),也可以把自己的插件不放到Qt 的安装路径下,但使用的时候必需在引用项目工程文件中用 QMLPATHS 指定(eg:QMLPATHS += /your/plugin/path)

 

5.插件库中的资料文件必需用宏Q_INIT_RESOURCE初始化,Qt 源码是在插件的C++类的构造函数初始化的(eg:Q_INIT_RESOURCE(your-qrc-file-name);Q_INIT_RESOURCE(your-qrc-file-name2);)

6. pulugins.qmltypes在静态插件库是必需要的,手动是通过 Qt 提供的 qmlplugindump 工具生成的,(eg:qmlplugindump -output <output-file.qmltypes> Qt.labs.folderlistmodel 2.0 /home/user/dev/qt-install/imports);希望有同学提供自动生成的代码;如果不能生成pulugins.qmltypes文件,可以用一个空的插件库生成一个pulugins.qmltypes,然后自己手动修改两处也可以用的

    Component {
        name: "MyDate"  // MyDate c++ 类名(改成自己的) // qmlRegisterType<MyDate>(uri, 1, 0, "MDate");
        defaultProperty: "data"
        prototype: "QQuickItem"
        exports: ["MDate 1.0"] // MDate QML 中使用的 类型名(改成自己的) // qmlRegisterType<MyDate>(uri, 1, 0, "MDate");
        exportMetaObjectRevisions: [0]
        Property { name: "year"; type: "int" }
        Property { name: "month"; type: "int" }
        Property { name: "day"; type: "int" }
    }

7. 参考 Qt 自带插件 QtWebView 工程文件

 

常见错误解决办法:

1.static plugin for module “QtQuick” with name “your-module-name” has no metadata URI

  在插件工程文件中添加:QMAKE_MOC_OPTIONS += -Muri=$$URI #URI = your-module-name

 参考:https://github.com/wang-bin/QtAV/issues/368

  

2.Plugin “your-module-name” is missing a classname entry

   qmldir 文件添加: classname your-plugin—c++-name

   参考:http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html

 

3. module “your-plugin-module-name” is not installed

   插件库的 qmldir 文件添加到插件库的 qrc 文件中,参考上文提供的方法;plugins.qmltypes 文件放到插件的安装目录下,且在 qmldir 文件中通过 typeinfo 指定

   app pro 文件要设置如下:

QMAKE_LFLAGS += -force_load $$(PWD)/plugins/your-plugin-module-name/lib$$qtLibraryTarget(your-plugin-module-name).a
 

4.file::/qmldir:-1 module ":" plugin "your-plugin-module-name" not found

   检查插件库中的 qmldir 文件在插件库的 qrc 文件中的 prefix 是不是在您的 QMLPATHS 指定的路径中

要测试工程的加QQ:283908183

Demo:演示代码(上传csdn默认要上2积分,没有积分的同学可以加QQ获取)

本人傻傻的什么都不懂,欢迎同学们拍砖

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值