企业网站信息化建设,淮南app,营销 网站制作,深圳福田会展中心近期展会前文链接#xff1a;QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载#xff0c;是指线程每准备好一个瓦片数据后#xff0c;立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后#xff0c;一起抛出信号让…前文链接QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载是指线程每准备好一个瓦片数据后立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后一起抛出信号让主线程加载瓦片。两者都是多线程加载瓦片都能够保证地图的流畅性区别仅仅是加载地图呈现的效果不同而已。本片文章将提供瓦片缓存类的源码供大家参考。 1、动态演示效果 2、静态展示图片 缓存类代码
#pragma once/** 瓦片缓存*/#include QListtemplateclass Key, class T
class TileItemCache : public QHashKey, T
{
public:inline void setMaxCost(int maxCost) {if (size() maxCost) {int count size() - maxCost;for (int i 0; i count; i) {dequeue();}}m_maxCost maxCost;}int maxCost() { return m_maxCost; }T first() {return m_keys.size() ? value(m_keys[0]) : (std::is_pointer_vT ? (new std::remove_pointer_tT()) : T());}inline void enqueue(const Key k, const T t) {if (size() m_maxCost) {auto it find(k);if (it ! end()) {dequeue();}} else {insert(k, t);m_keys.append(k);} }inline void dequeue() {if (m_keys.size() 0)return;Key k m_keys.takeFirst();T item take(k);delete item;item nullptr;}T take(const Key key) {m_keys.removeOne(key);return QHash::take(key);}inline QListKey keys() const { return QHashKey, T::keys(); }inline QListT values() const { return QHashKey, T::values(); }void clear() {qDeleteAll(begin(), end());QHashKey, T::clear();m_keys.clear();}private:int m_maxCost 0;QListKey m_keys;
};