簡體   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