qt的血泪教训——地图存储与绘制

文章目录

  • 前言
  • [一. 项目背景](#一. 项目背景)
  • [二. 代码实现](#二. 代码实现)
    • [1. 指针数组创建](#1. 指针数组创建)
    • [2. gui坐标和数组的对应问题](#2. gui坐标和数组的对应问题)

前言

本文并不是严格的教程,只是笔者考试一败涂地后的碎碎念

一. 项目背景

从文件读入数据, 文件共有M + 1行, 数据格式如下:

text 复制代码
m n
a(0,0) a(0,1) ... a(0,n-1)
...
a(m-1,0) a(m-1,1) ... a(m-1,n-1)

m为地图的行数, n为地图的列数,

a(x,y)表示第x行第y列的数值:

  • =0, 用绿色表示
  • =1, 用红色表示

二. 代码实现

1. 指针数组创建

c++ 复制代码
class MainWindow : public QWidget
{
	...
	int **map;
	int m, n;
};
void MainWindow::load()
{
	map = new int*[m]; // m行
	for(int i = 0; i < m; ++i){
		//注意, 这里是对刚刚创建好的每一行进行操作, 所以循环到m
		map[i] = new int[n];
	}
}

2. gui坐标和数组的对应问题

然后就是本文的核心了, 也是最容易弄错的地方. 由于存地图的时候先存行数后存列数, 所以每个坐标(x, y)表示的是x行y列, 然而在绘图的时候用的是xy坐标, 也就是说, 横坐标对应的是列数, 纵坐标对应的是行数, 和存储正好相反. 因此paint函数应该如下:

c++ 复制代码
void MainWindow::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	const int FILE_SIZE = 60;
	for(int y = 0; y < m; ++y){//先行,先y
		for(int x = 0; x < n; ++x){//后列,后x
			switch(map[x][y]){
			case 0:
			painter.fillRect(x * FILE_SIZE, y * FILE_SIZE, FILE_SIZE, FILE_SIZE, Qt::green);
				break;
			case 1:
			painter.fillRect(x * FILE_SIZE, y * FILE_SIZE, FILE_SIZE, FILE_SIZE, Qt::red);
				break;
			}	
		}
	}
}

否则绘制出来的图形会是轴对称的,长宽颠倒.

相关推荐
光源【时光寸寸又逢君】12 分钟前
第三方平台预览我方级联监控点串流问题排查
c++·iot
键盘会跳舞1 小时前
C++:容器适配器 queue 的源码级拆解
开发语言·c++·queue
YuforiaCode2 小时前
第十六届蓝桥杯 2025 C/C++组 数列差分
c语言·c++·蓝桥杯
千里之行,始于足下sanhai2 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场2 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
Loge编程生活2 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
lilili也5 小时前
visual studio add matlab
c语言·c++
沫璃染墨5 小时前
《Qt从零入门系列(一):Qt框架初识——从发展历史到跨平台开发》
c++·qt·系统架构·gui
(Charon)6 小时前
【C++】多线程死锁:产生原因、复现与解决方法
开发语言·c++·算法
oier_Asad.Chen6 小时前
【洛谷题解/AcWing题解/真题】洛谷P2330【SCOI2005】繁忙的都市(Kruskal算法的再探究))
c++·算法·贪心算法·图论·最小生成树·kruskal