Reputation: 24228
Say I have a QML Text like:
Text {
textFormat: Text.RichText
text: '<img src="http://www.example.com/logo.jpg"/>'
}
Is there a built in way to honor cache TTLs for the image source filed linked from the html snippet? I realize I could swap
http://www.example.com/logo.jpg
for
file://path/to/app/logo.jpg
but then I will have to manage a file cache. Is there a setting to have QT/QML do this for me automatically?
Upvotes: 0
Views: 280
Reputation: 5836
It should be doable with help of QQmlNetworkAccessManagerFactory
, QNetworkAccessManager
, and 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;
}
};
And then install the factory on the engine:
QQmlApplicationEngine engine;
engine.setNetworkAccessManagerFactory(new MyNetworkAccessManagerFactory);
engine.load(...);
Upvotes: 2