應該是可行的與QQmlNetworkAccessManagerFactory
,QNetworkAccessManager
幫助,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(...);
我設置一個超長的緩存時間頭來自網絡服務器的詳細信息,我在二進制高速緩存文件中看到它有很長的TTL,但是如果我關閉訪問互聯網,我會得到:「QML QQuickText:網絡訪問被禁用。」有沒有辦法讓它檢查緩存並在檢查互聯網連接之前嘗試處理請求? –
好吧,我通過操作'PreferCache'和'AlwaysCache'來解決這個問題。我正在編輯內聯。 –