2017-04-17 26 views
0

說我有一個QML Text,如:QML Text.RichText URL緩存可能嗎?

Text { 
textFormat: Text.RichText 
text: '<img src="http://www.example.com/logo.jpg"/>' 
} 

有HTML代碼段中內置的方式兌現緩存的TTL的圖像源鏈接提起?我知道我可以換

http://www.example.com/logo.jpg 

file://path/to/app/logo.jpg 

但我將不得不管理文件緩存。是否有一個設置讓QT/QML自動執行此操作?

回答

1

應該是可行的與QQmlNetworkAccessManagerFactoryQNetworkAccessManager幫助,QNetworkDiskCache

class MyNetworkAccessManager : public QNetworkAccessManager 
{ 
public: 
    MyNetworkAccessManager(QObject *parent) : QNetworkAccessManager(parent) { } 

protected: 
    QNetworkReply *createRequest(Operation operation, const QNetworkRequest &request, QIODevice *outgoingData = nullptr) override 
    { 
     QNetworkRequest cacheRequest(request); 
     cacheRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, 
      (networkAccessible() == QNetworkAccessManager::Accessible) ? QNetworkRequest::PreferCache : QNetworkRequest::AlwaysCache); 
     return QNetworkAccessManager::createRequest(operation, cacheRequest, outgoingData); 
    } 
}; 

class MyNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory 
{ 
public: 
    QNetworkAccessManager *create(QObject *parent) override 
    { 
     QNetworkAccessManager *nam = new MyNetworkAccessManager(parent); 
     QNetworkDiskCache *cache = new QNetworkDiskCache(nam); 
     cache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); 
     nam->setCache(cache); 
     return nam; 
    } 
}; 

然後安裝在發動機上的工廠:

QQmlApplicationEngine engine; 
engine.setNetworkAccessManagerFactory(new MyNetworkAccessManagerFactory); 
engine.load(...); 
+0

我設置一個超長的緩存時間頭來自網絡服務器的詳細信息,我在二進制高速緩存文件中看到它有很長的TTL,但是如果我關閉訪問互聯網,我會得到:「QML QQuickText:網絡訪問被禁用。」有沒有辦法讓它檢查緩存並在檢查互聯網連接之前嘗試處理請求? –

+0

好吧,我通過操作'PreferCache'和'AlwaysCache'來解決這個問題。我正在編輯內聯。 –