QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

news/2025/2/9 5:46:26 标签: qt, QGraphicsView, 地图

前文链接: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;
};

http://www.niftyadmin.cn/n/5243002.html

相关文章

关于找不到mfc140u.dll,无法继续执行代码问题的修复教程详解

在打开电脑软件过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到mfc140u.dll&#xff0c;无法继续执行代码”。这个问题可能是由于多种原因引起的&#xff0c;但不用担心&#xff0c;下面我将为大家介绍五种解决方案。 首先&#xff0c;让我们了…

操作系统的运行机制+中断和异常

一、CPU状态 在CPU设计和生产的时候就划分了特权指令和非特叔指令&#xff0c;因此CPU执行一条指令前就能断出其类型 CPU有两种状态&#xff0c;“内核态”和“用户态” 处于内核态时&#xff0c;说明此时正在运行的是内核程序&#xff0c;此时可以执行特权指令。 处于用户态…

pymysql.err.InternalError: (1054, “Unknown column ‘nan‘ in ‘field list‘“

记录在本地环境通过&#xff0c;然后在云环境&#xff0c;解决问题的过程&#xff1b; 最近两天遇到一个bug&#xff0c;具体就是在本地Pyhon环境运行成功&#xff0c;但是当放在云服务跑的时候&#xff0c;去屡屡报错&#xff0c;具体报错信息如下&#xff1a; pymysql.err.I…

ZKP Understanding Nova (1): MinRoot Example

Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 1. Unders…

基于微服务架构的外卖系统源码开发

在当前互联网时代&#xff0c;外卖行业蓬勃发展&#xff0c;用户对于高效、智能的外卖服务需求不断增加。为了满足这一需求&#xff0c;采用微服务架构的外卖系统成为了开发的主流方向。本文将探讨基于微服务的外卖系统源码开发&#xff0c;涉及到关键技术和示例代码。 1. 微…

使用Java语言进行账户登录和密码输入

一、操作原理 使用Scanner扫描器进行扫描&#xff0c;使用if语句、if-else语句和else进行账户和密码的验证。 二、相关代码 import java.util.Scanner; public class CheckLoginDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) …

科普Web与App测试5大区别!

随着各种移动设备的更新换代&#xff0c;移动互联网呈飞速发展状态&#xff0c;同时&#xff0c;移动应用更是呈指数增长。因为这种情况&#xff0c;app测试方面需求也随之大涨&#xff0c;已经逐渐赶超web测试。我做了快三年的测试了&#xff0c;大部分时间都在做app的测试&am…

[NAND Flash 2.3] 闪存芯片国产进程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 目录 前言1 闪存介质1.1 NOR 闪存国产技术发展1.2 NAND 闪存国产技术 2 闪存国产厂商与产品2.1 NOR FLASH 国产厂商与产品2.2 NAND FA…