Archive:Development/Tutorials/KPixmapCache (zh CN): Difference between revisions
No edit summary |
m (AnneW moved page Development/Tutorials/KPixmapCache (zh CN) to Archive:Development/Tutorials/KPixmapCache (zh CN) without leaving a redirect: Obsolete) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
== 介绍 == | == 介绍 == | ||
{{class|KPixmapCache}} 对QPixmaps提供磁盘缓存。如果你使用矢量图形或从数据产生位图,那么缓存机制可以避免一次又一次从数据中产生同样的位图。 | {{class|KPixmapCache}} 对QPixmaps提供磁盘缓存。如果你使用矢量图形或从数据产生位图,那么缓存机制可以避免一次又一次从数据中产生同样的位图。 | ||
Line 7: | Line 7: | ||
API和QPixmapCache的差不多。 | API和QPixmapCache的差不多。 | ||
使用前,先创建一个缓存对象,并起个不重复的名字: | 使用前,先创建一个缓存对象,并起个不重复的名字: | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
KPixmapCache* cache = new KPixmapCache("myapp-images"); | KPixmapCache* cache = new KPixmapCache("myapp-images"); | ||
</ | </syntaxhighlight> | ||
=== 插入并发现位图 === | === 插入并发现位图 === | ||
然后用insert()或find()方法就可以很容易的获取插入图像了: | 然后用insert()或find()方法就可以很容易的获取插入图像了: | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
QPixmap pix("file1.png"); | QPixmap pix("file1.png"); | ||
cache->insert("file1.png", pix); | cache->insert("file1.png", pix); | ||
Line 26: | Line 26: | ||
cache->insert("file2.png", pix2); | cache->insert("file2.png", pix2); | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 简单方法 === | === 简单方法 === | ||
从文件加载位图并使用缓存是个常用操作,KPixmapCache提供了简洁的方法: | 从文件加载位图并使用缓存是个常用操作,KPixmapCache提供了简洁的方法: | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
QString filename("myfile.png"); | QString filename("myfile.png"); | ||
QPixmap pix = cache->loadFromFile(filename); | QPixmap pix = cache->loadFromFile(filename); | ||
</ | </syntaxhighlight> | ||
首先检查给定文件是否已经在缓存里了。如果在,从缓存加载;否则从文件加载并加到缓存里面。 | 首先检查给定文件是否已经在缓存里了。如果在,从缓存加载;否则从文件加载并加到缓存里面。 | ||
对矢量文件,有相同的方法: | 对矢量文件,有相同的方法: | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
QString filename("myfile.svg"); | QString filename("myfile.svg"); | ||
QPixmap pix = cache->loadFromSvg(filename); | QPixmap pix = cache->loadFromSvg(filename); | ||
</ | </syntaxhighlight> | ||
这会把矢量文件转化为位图,矢量图的缺省大小就是转化后的大小。如果你要指定一个其它的大小,只要在第二个参数里指定就可以了: | 这会把矢量文件转化为位图,矢量图的缺省大小就是转化后的大小。如果你要指定一个其它的大小,只要在第二个参数里指定就可以了: | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
QString filename("myfile.svg"); | QString filename("myfile.svg"); | ||
QSize size(150, 250); | QSize size(150, 250); | ||
QPixmap pix = cache->loadFromSvg(filename, size); | QPixmap pix = cache->loadFromSvg(filename, size); | ||
</ | </syntaxhighlight> | ||
这里矢量数据会被转化成位图,大小为150x250象素。 | 这里矢量数据会被转化成位图,大小为150x250象素。 | ||
Line 53: | Line 53: | ||
通常,缓存里的内容要确保是最新的。过时的内容就要被更新了。为此,缓存提供了一个timestamp() 时间戳方法。缺省返回缓存创建时间,但你可以通过setTimestamp()方法设置你认为的时间。 | 通常,缓存里的内容要确保是最新的。过时的内容就要被更新了。为此,缓存提供了一个timestamp() 时间戳方法。缺省返回缓存创建时间,但你可以通过setTimestamp()方法设置你认为的时间。 | ||
< | <syntaxhighlight lang="cpp-qt"> | ||
// 数据 | // 数据 | ||
MyDataObject data; | MyDataObject data; | ||
Line 73: | Line 73: | ||
} | } | ||
// 给用户展现那副图像。 | // 给用户展现那副图像。 | ||
</ | </syntaxhighlight> | ||
这个例子展示了如何显示一些数据。如果数据比缓存里的新,那就用discard()方法删除缓存内容。下一步, 检查缓存是否已经有了需要的位图。如果是,就不必在从数据产生了(这事很耗资源的操作)。 | 这个例子展示了如何显示一些数据。如果数据比缓存里的新,那就用discard()方法删除缓存内容。下一步, 检查缓存是否已经有了需要的位图。如果是,就不必在从数据产生了(这事很耗资源的操作)。 | ||
=== 应用程序接口(API)文档 === | === 应用程序接口(API)文档 === | ||
要看所有的KPixmapCache方法, 这里有所有的[http://api.kde.org/classmapper.php?class=KPixmapCache&module=kdelibs&version=4.0 API 文档]. | 要看所有的KPixmapCache方法, 这里有所有的[http://api.kde.org/classmapper.php?class=KPixmapCache&module=kdelibs&version=4.0 API 文档]. |
Latest revision as of 13:09, 23 June 2013
介绍
KPixmapCache 对QPixmaps提供磁盘缓存。如果你使用矢量图形或从数据产生位图,那么缓存机制可以避免一次又一次从数据中产生同样的位图。
使用
创建缓存对象
API和QPixmapCache的差不多。 使用前,先创建一个缓存对象,并起个不重复的名字:
KPixmapCache* cache = new KPixmapCache("myapp-images");
插入并发现位图
然后用insert()或find()方法就可以很容易的获取插入图像了:
QPixmap pix("file1.png");
cache->insert("file1.png", pix);
QPixmap pix2;
if (cache->find("file2.png", pix2)) {
// 从缓存中加载图像
} else {
// 图像没有在缓存里找到
// 加载并插入:
pix2 = QPixmap("file2.png");
cache->insert("file2.png", pix2);
}
简单方法
从文件加载位图并使用缓存是个常用操作,KPixmapCache提供了简洁的方法:
QString filename("myfile.png");
QPixmap pix = cache->loadFromFile(filename);
首先检查给定文件是否已经在缓存里了。如果在,从缓存加载;否则从文件加载并加到缓存里面。
对矢量文件,有相同的方法:
QString filename("myfile.svg");
QPixmap pix = cache->loadFromSvg(filename);
这会把矢量文件转化为位图,矢量图的缺省大小就是转化后的大小。如果你要指定一个其它的大小,只要在第二个参数里指定就可以了:
QString filename("myfile.svg");
QSize size(150, 250);
QPixmap pix = cache->loadFromSvg(filename, size);
这里矢量数据会被转化成位图,大小为150x250象素。
时间戳
通常,缓存里的内容要确保是最新的。过时的内容就要被更新了。为此,缓存提供了一个timestamp() 时间戳方法。缺省返回缓存创建时间,但你可以通过setTimestamp()方法设置你认为的时间。
// 数据
MyDataObject data;
// 确保缓存足够新
if (cache->timestamp() < data.timestamp()) {
// 数据比缓存的要新
// 缓存过时了,撤销,重载
cache->discard();
}
// 缓存内容足够新
QPixmap visualizedData;
QString key("data-visualization");
// 试图从缓存里找图像
if (!cache->find(key, visualizedData)) {
// 图像不在缓存,重新创建...
visualizedData = createVisualization(data);
// ...把结果放入缓存里
cache->insert(key, visualizedData);
}
// 给用户展现那副图像。
这个例子展示了如何显示一些数据。如果数据比缓存里的新,那就用discard()方法删除缓存内容。下一步, 检查缓存是否已经有了需要的位图。如果是,就不必在从数据产生了(这事很耗资源的操作)。
应用程序接口(API)文档
要看所有的KPixmapCache方法, 这里有所有的API 文档.