[英]How to define Qml component file resolver for Qt 5.5 + QtQuick 2.5?
有什么方法可以为QmlEngine中缺少的Qml组件实现动态文件解析器吗? 如何实现将外部资源动态加载到QmlEngine?
我可以使用以下代码片段从任何数据流加载qml组件:
QUrl uri(...)
QByteArray data(...);
QQmlComponent::setData(data,uri);
但是当传递的组件引用另一个组件(尚未加载)时,QmlEngine因缺少资源而停止了。
是否有任何事件/回调可以处理此类丢失的资源?
添加了用例场景:
我们正在开发一些QML视觉组件。 一些组件实现为.qml files
,而QQuickItem
一些实现为QQuickItem
。
例如,设想以下情况(非常简化):
QmlItem
“ DiagramPoint”,在point.qml中实现 QmlItem
“ Line”在line.qml中实现,类正在使用“ DiagramPoint”项目 QQuickItem (c++)
“ ConnectedLine”,内部使用“ Line”对象 QmlProject
使用“ ConnectedLine”组件。 如果point.qml和line.qml位于硬盘上或存储在Qt Resources内,则一切都会自动运行。 但是,我们要实现的是将这些文件以加密形式存储在我们的内部.dat file
,并仅根据需要对其进行解码。
我们能够从“ ConnectedLine”实现中解码并加载“ Line”对象。 但是,如果“行”(line.qml)依赖于另一个加密文件“ DiagramPoint”(point.qml),则此解决方案不起作用。
另一种可能的解决方案
另一种解决方案是在应用程序启动时注册所有解密的.qml文件,然后使用它。 与qmlRegisterType
类似的东西,可以将c ++ QQuickItems
注册到QmlEngine
。
不幸的是,这些方法均不允许从字符串缓冲区中注册Qml代码段。
我仍然不确定如何执行此操作,但是您可能会发现QQmlAbstractUrlInterceptor
有用:
QQmlAbstractUrlInterceptor是一个接口,可用于在QML引擎使用URL之前更改URL。 这主要用于将文件url更改为其他文件url,例如为当前平台选择不同的图形资产。
根据当前QML上下文的文件路径解析相对URL后,将对其进行拦截。 为已加载的QML文件设置基本路径后,也会发生URL拦截。 这意味着为该QML文件加载的内容使用了截获的URL,但是在文件内部,预截取的URL用于解析相对路径。 这允许截取.qml文件,而无需在截取的内容内的所有路径(或本地类型)插入不同的相对路径。
与setNetworkAccessManagerFactory相比,QQmlAbstractUrlInterceptor影响所有URL和路径,包括本地文件和嵌入式资源文件。 QQmlAbstractUrlInterceptor是同步的,对于异步文件,必须使用异步方案(例如http或由您自己的自定义QNetworkAccessManager处理的自定义方案)返回url。 您可以使用QQmlAbstractUrlInterceptor将文件URL更改为由自己的自定义QNetworkAccessManager处理的网络URL。
要实现对自定义网络方案的支持,请参见setNetworkAccessManagerFactory。
它说它是同步的,所以也许在拦截URL以确保它们存在时,您可以解码QML文件吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.