QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』
前文链接: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;
};