- 前言
- 一、QT是什么?
- 二、课程设计
- 1.结点设计
- 2.构造函数
- 3.获取顶点和边的信息
- 4.Floyd算法
- 5.路径输出
- 三、图形界面UI(一些细节,篇幅有限)
- 1.固定窗口
- 2.画箭头
- 四、打包
- 最终效果展示
前言
博主是一名大二的学生,数据结构课题是城市最少交通时间,由于需要图形界面,所以自学了一点QT(B站的视频),基于C++所学知识和Floyd算法完成了课程设计。本文是我的课设报告分享,之后如果有需要会分享打包好的程序和源码供大家参考。
一、QT是什么?
QT是一个跨平台的 C++ 开发库,是一个跨平台的C++图形用户界面应用程序框架,主要用来开发图形用户界面。
二、课程设计 1.结点设计template2.构造函数struct EdgeType { T head, tail; int cost; EdgeType(T h = 0, T t = 0, int c = 0) { head = h; tail = t; cost = c; } }; template struct Edge { T adjvex; int lowcost; }; template
template3.获取顶点和边的信息void MGraph ::create(QVector v, int n, int e) { vexnum = n; edgenum = e; vexs.resize(vexnum); edges.resize(vexnum); for (int i = 0; i < n; i++) edges[i].resize(vexnum); for (int i = 0; i < n; i++) vexs[i] = v[i]; //初始化edges数组 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) edges[i][j] = 0; else edges[i][j] = INT_MAX; } } }
//返回顶点数 template4.Floyd算法int MGraph ::VexterNum() { return vexnum; } //返回边数 template int MGraph ::EdgeNum() { return edgenum; } //得到对应位置的顶点值 template T MGraph ::GetVexValue(int i) { return vexs[i]; } //得到相应值的顶点位置 template int MGraph ::GetVexValueNum(T v) { int i; for (i = 0; i < vexnum; i++) if (vexs[i] == v) return i; return -1; } template int MGraph ::GetEdgeValue(int i, int j) { return edges[i][j]; }
//Floyd最短路径算法 template5.路径输出void MGraph ::Floyd(QVector >& Path, QVector >& D) { for (int i = 0; i < vexnum; i++) for (int j = 0; j < vexnum; j++) { if (i == j) D[i][j] = 0; else D[i][j] = GetEdgeValue(i, j); if (D[i][j] < INT_MAX) Path[i][j] = j; else Path[i][j] = -1; } for (int k = 0; k < vexnum; k++) for (int i = 0; i < vexnum; i++) for (int j = 0; j < vexnum; j++) if (D[i][j] > D[i][k] + D[k][j] && D[i][k] != INT_MAX && D[k][j] != INT_MAX) { D[i][j] = D[i][k] + D[k][j]; Path[i][j] = Path[i][k]; } }
template三、图形界面UI(一些细节,篇幅有限) 1.固定窗口void MGraph ::OutputPath(QVector & minpath,QVector >& Path,T sta,T end) { int i = GetVexValueNum(sta); int j = GetVexValueNum(end); int tempi = i; minpath.push_back(tempi); while (j != Path[tempi][j]) { tempi = Path[tempi][j]; minpath.push_back(tempi); } minpath.push_back(j); }
为了突出对比,对显示区域和空间区域喷涂了不同的背景
setFixedSize(1400,1000);
QPixmap pix;
pix.load(":\background\photo8.jpg");//1,4,5,6,8,9,11
painter.drawPixmap(0,0,900,1000,pix);
pix.load(":\background\photo1.jpg");//1,4,5,6,8,9,11
painter.drawPixmap(900,0,500,1000,pix);
2.画箭头
QT没有自带画箭头操作,我们画两条线段实现
float x1=begin.x();
float y1=begin.y();
float x2=mid.x();
float y2=mid.y();
double angle=atan2(y2-y1,x2-x1); //中点添加箭头
float l=50;
float a=0.5;
float nx1=x2-l*cos(angle-a);
float ny1=y2-l*sin(angle-a);
float nx2=x2-l*cos(angle+a);
float ny2=y2-l*sin(angle+a);
QPoint newpoint1(nx1,ny1);
QPoint newpoint2(nx2,ny2);
painter.drawLine(mid,newpoint1);
painter.drawLine(mid,newpoint2);
四、打包
当我以为一切大功告成的时候,打包又出了问题。Qt自带打包windeplouqt。
打包的目的是让没有安装Qt的人也可以运行程序,然而它却提示我缺少******dll文件。无可奈何,找到了这个dll文件放到当前目录下,然后自信的点击exe文件,再次报错。。。。
痛定思痛,突然想到安装Qt时安装了多个版本(打包版本要与编辑版本一致)。
以上就是今天我要分享的内容,感谢阅读。



