如何在Qt QML应用中开启cache使得应用更加快捷
来源:互联网 发布:淘宝网点击客服没反应 编辑:程序博客网 时间:2024/06/11 02:59
在网路应用中,我们会经常从网路上下载数据或使用网路上的图片等.这些图片在我们的应用中,有可能被反复利用.如果没有cache的机制,我们的应用就会反复地发送请求,并下载同样的数据,一遍又一遍.这样不光浪费我们的流量,而且有可能造成用户界面的流畅性.今天在我们的例程中,我们来教大家如何来创建一个网路的cache,并被我们的应用所使用.
创建一个Cache的目录及路径
QString getCachePath(){ QString writablePath = QStandardPaths:: writableLocation(QStandardPaths::DataLocation); qDebug() << "writablePath: " << writablePath; QString absolutePath = QDir(writablePath).absolutePath(); qDebug() << "absoluePath: " << absolutePath; absolutePath += "/cache/"; // We need to make sure we have the path for storage QDir dir(absolutePath); if ( dir.mkpath(absolutePath) ) { qDebug() << "Successfully created the path!"; } else { qDebug() << "Fails to create the path!"; }// QString path = absolutePath + "/" + filename; qDebug() << "cache path: " << absolutePath; return absolutePath;}
writablePath: "/home/phablet/.local/share/networkaccessmanagerfactory.liu-xiao-guo"absoluePath: "/home/phablet/.local/share/networkaccessmanagerfactory.liu-xiao-guo"Successfully created the path!cache path: "/home/phablet/.local/share/networkaccessmanagerfactory.liu-xiao-guo/cache/"
创建NetworkAccessManagerFactory
class MyNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory{public: virtual QNetworkAccessManager *create(QObject *parent);};QNetworkAccessManager *MyNetworkAccessManagerFactory::create(QObject *parent){ qDebug() << "it is being called!"; QNetworkAccessManager *nam = new QNetworkAccessManager(parent); QString path = getCachePath(); QNetworkDiskCache* cache = new QNetworkDiskCache(parent); cache->setCacheDirectory(path); nam->setCache(cache); return nam;}
在这里,我们创建了一个我们需要的NetworkAccessManager,并创建了一个QNetworkDiskCache.在Qt应用中,在默认的情况下,是没有任何的cache的.更加详细的阅读可以参阅文章"QNetworkAccessManager". 我们把我们需要的cache目录路径传人到我们的QNetworkDiskCache当中去.
加载NetworkAccessManagerFactory到我们的QML engine中去
int main(int argc, char *argv[]){ QGuiApplication app(argc, argv); QQuickView view; qDebug() << "Original factory: " << view.engine()->networkAccessManagerFactory(); qDebug() << "Original manager: " << view.engine()->networkAccessManager(); QNetworkDiskCache* cache = (QNetworkDiskCache*)view.engine()->networkAccessManager()->cache(); qDebug() << "Original manager cache: " << cache; view.engine()->setNetworkAccessManagerFactory(new MyNetworkAccessManagerFactory); view.setSource(QUrl(QStringLiteral("qrc:///Main.qml"))); view.setResizeMode(QQuickView::SizeRootObjectToView); view.show(); return app.exec();}
在这里我们通过如下的方法:
view.engine()->setNetworkAccessManagerFactory(new MyNetworkAccessManagerFactory);
把我们需要的Factory加载到我们的QML engine中.在上面,我们也展示了在没有设置Factory之前的信息:
Original factory: 0x0Original manager: QNetworkAccessManager(0x268a60)Original manager cache: QObject(0x0)
在QML中发送网路请求
import QtQuick 2.0import Ubuntu.Components 1.1/*! \brief MainView with a Label and Button elements.*/MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "networkaccessmanagerfactory.liu-xiao-guo" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false width: units.gu(60) height: units.gu(85) Page { title: i18n.tr("networkaccessmanagerfactory") Image { anchors.fill: parent source: "http://v1.qzone.cc/avatar/201308/08/21/22/52039b7e538f5649.jpg!200x200.jpg" fillMode: Image.PreserveAspectCrop } }}
在这里,我们利用Image来发送一个网路请求,并查看我们的图片是否已经在cache里:
我们可以查看一下我们的cache目录里的情况:
在这里,我们的确看见一个 cache的文件,并且它的大小和我们实际的文件大小相似.
整个项目的源码在:https://github.com/liu-xiao-guo/networkaccessmanagerfactory
0 0
- 如何在Qt QML应用中开启cache使得应用更加快捷
- 如何在QML应用中读写文件
- 如何在QML应用中启动Scope
- 如何在Qt C++中解析JSON数据并使之被QML应用
- 如何在Qt应用中退出应用
- QML笔记整理——在Qt/C++应用中使用QML
- 如何在Ubuntu QML应用中使用Push Notification
- 如何在QML应用中使用Javascript解析JSON
- 如何在QML应用中使用Javascript来解析XML
- 如何在Ubuntu QML应用中播放音乐
- 如何在Ubuntu QML应用中播放视频
- 如何在Ubuntu QML应用中震动(vibration)
- 如何在QML应用中实现一个Splash画面
- 如何在Ubuntu QML应用中进行语言录音
- 如何在QML应用中设计自己的Dialog
- 在QML应用中如何实现drag and drop功能
- 如何在QML应用中创建一个Context Menu
- 如何在Ubuntu QML应用中实现MultipleSelectionListView
- 大数据相关书籍列表
- OpenGL教程翻译 第十六课 基本的纹理贴图
- Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压
- Hadoop2.7.1安装与配置
- 使用bximage制作软盘映像
- 如何在Qt QML应用中开启cache使得应用更加快捷
- 黑马程序员——Java之多线程(2)
- 实战抓取糗事百科
- VM下ubuntu14.10中搭建android环境(android studio)
- 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践
- Hadoop、Spark、HBase与Redis的适用性讨论
- jQuery选择器总结
- appcompat_v7错误解决方法
- 黑马程序员——Java之IO流(2)