繁体   English   中英

如何为Qt 5.5 + QtQuick 2.5定义Qml组件文件解析器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM