gpt4 book ai didi

qt - 如何控制QML中HTTP资源的缓存?

转载 作者:行者123 更新时间:2023-12-01 21:19:23 27 4
gpt4 key购买 nike

考虑下面的代码,它获取 RSS 提要,然后将其中的图像显示为永远循环的幻灯片:

import QtQuick 2.2
import QtQuick.XmlListModel 2.0

Rectangle {
id: window
color: "black"
width: 800
height: 480

PathView {
anchors.fill: parent

highlightRangeMode: PathView.StrictlyEnforceRange
preferredHighlightBegin: 0.5
preferredHighlightEnd: 0.5
highlightMoveDuration: 500
snapMode: PathView.SnapOneItem
pathItemCount: 3 // only show previous, current, next

path: Path { // horizontal
startX: -width; startY: height/2
PathLine{x: width*2; y: height/2}
}


model: XmlListModel {
source: "http://feeds.bbci.co.uk/news/business/rss.xml"
query: "/rss/channel/item"
namespaceDeclarations: "declare namespace media = 'http://search.yahoo.com/mrss/';"
XmlRole { name: "image"; query: "media:thumbnail/@url/string()" }
}


delegate: Image {
width: PathView.view.width
height: PathView.view.height
source: image
fillMode: Image.PreserveAspectCrop
}


Timer { // automatically loop through the images
interval: 1000; running: true; repeat: true;
onTriggered: {
parent.incrementCurrentIndex()
}
}


Timer {
interval: 600000; running: true; repeat: true;
onTriggered: parent.model.reload()
}

}
}

此代码根据需要从网络加载图像。然而,一旦图像不再显示,它就会丢弃数据。下次幻灯片循环播放时,将从网络重新加载图像。因此,只要代码运行,代码就会每秒访问远程图像服务器一次,每次下载 50-300KB。

该代码在 RAM 不多的嵌入式系统上运行,因此,当代理不在路径上时,无法通过保留代理来缓存解码的图像数据。

相反,缓存应该在 HTTP 级别完成,存储原始下载的文件。因此它应该遵守 HTTP 缓存控制 header 。

由于系统只有一个小闪存盘,因此缓存只能在内存中完成。

如何在 Qt 中实现此功能?我认为它将涉及 C++ 代码,那很好。

最佳答案

要控制 QML 获取网络资源时的缓存行为,您可以子类 QQmlNetworkAccessManagerFactory并让它创建 QNetworkAccessManagers附有缓存。然后将工厂附加到您的 QQmlEngine :

class MyNAMFactory : public QQmlNetworkAccessManagerFactory
{
public:
virtual QNetworkAccessManager *create(QObject *parent);
};

QNetworkAccessManager *MyNAMFactory::create(QObject *parent)
{
QNetworkAccessManager *nam = new QNetworkAccessManager(parent);
nam->setCache(new QNetworkDiskCache(parent));
return nam;
}

int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QQuickView view;
view.engine()->setNetworkAccessManagerFactory(new MyNAMFactory);
view.setSource(QUrl("qrc:///main.qml"));
view.show();

return app.exec();
}

缓存必须实现QAbstractNetworkCache界面。 Qt 有一种内置缓存类型,QNetworkDiskCache顾名思义,它将缓存保存到磁盘。没有用于内存缓存的内置类,但使用 QHash 来实现一个是相当容易的。存储 URL、数据和元数据。

关于qt - 如何控制QML中HTTP资源的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38490614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com