前文链接:QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』
前一篇文章提到的异步单瓦片加载,是指线程每准备好一个瓦片数据后,立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后,一起抛出信号让主线程加载瓦片。两者都是多线程加载瓦片,都能够保证地图的流畅性,区别仅仅是加载地图呈现的效果不同而已。本片文章将提供瓦片缓存类的源码,供大家参考。
1、动态演示效果
2、静态展示图片
缓存类代码
#pragma once/** 瓦片缓存*/#include <QList>template<class Key, class T>
class TileItemCache : public QHash<Key, 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_v<T> ? (new std::remove_pointer_t<T>()) : 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 QList<Key> keys() const { return QHash<Key, T>::keys(); }inline QList<T> values() const { return QHash<Key, T>::values(); }void clear() {qDeleteAll(begin(), end());QHash<Key, T>::clear();m_keys.clear();}private:int m_maxCost = 0;QList<Key> m_keys;
};