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;
};

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 04:06:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 04:06:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 04:06:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 04:06:03       18 阅读

热门阅读

  1. centos用户相关命令

    2023-12-07 04:06:03       30 阅读
  2. springboot工作原理

    2023-12-07 04:06:03       30 阅读
  3. 联合体union

    2023-12-07 04:06:03       37 阅读
  4. Oracle官网 账号及密码 -- 笔记

    2023-12-07 04:06:03       39 阅读
  5. 将元胞添加到元胞数组

    2023-12-07 04:06:03       34 阅读
  6. PTA 6-143 密码转换

    2023-12-07 04:06:03       38 阅读
  7. 2023亚太地区五岳杯量子计算挑战赛

    2023-12-07 04:06:03       41 阅读
  8. 前端面试题【构建工具篇】

    2023-12-07 04:06:03       29 阅读
  9. ROS 欧拉角

    2023-12-07 04:06:03       35 阅读
  10. FAQ:Constructors篇

    2023-12-07 04:06:03       28 阅读
  11. HG/T 5367.2-2022 轨道交通车辆耐电弧绝缘涂料检测

    2023-12-07 04:06:03       28 阅读
  12. rocketMQ-发送消息

    2023-12-07 04:06:03       30 阅读
  13. 获取图像大小 - 编程指南

    2023-12-07 04:06:03       38 阅读
  14. MongoDB导入导出命令

    2023-12-07 04:06:03       31 阅读