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