Ross Rogers
Ross Rogers

Reputation: 24228

Is QML Text.RichText URL caching possible?

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

Answers (1)

jpnurmi
jpnurmi

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

Related Questions