博主是一名大二的学生,数据结构课题是城市最少交通时间,由于需要图形界面,所以自学了一点QT(B站的视频),基于C++所学知识和Floyd算法完成了课程设计。本文是我的课设报告分享,之后如果有需要会分享打包好的程序和源码供大家参考。
QT是一个跨平台的 C++ 开发库,是一个跨平台的C++图形用户界面应用程序框架,主要用来开发图形用户界面。
template<class T>
struct EdgeType
{
T head, tail;
int cost;
EdgeType(T h = 0, T t = 0, int c = 0)
{
head = h; tail = t; cost = c;
}
};
template<class T>
struct Edge
{
T adjvex;
int lowcost;
};
template<class T>
template<class T>
void MGraph<T>::create(QVector<T> 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;
}
}
}
//返回顶点数
template<class T>
int MGraph<T>::VexterNum()
{
return vexnum;
}
//返回边数
template<class T>
int MGraph<T>::EdgeNum()
{
return edgenum;
}
//得到对应位置的顶点值
template<class T>
T MGraph<T>::GetVexValue(int i)
{
return vexs[i];
}
//得到相应值的顶点位置
template<class T>
int MGraph<T>::GetVexValueNum(T v)
{
int i;
for (i = 0; i < vexnum; i++)
if (vexs[i] == v)
return i;
return -1;
}
template<class T>
int MGraph<T>::GetEdgeValue(int i, int j)
{
return edges[i][j];
}
//Floyd最短路径算法
template<class T>
void MGraph<T>::Floyd(QVector<QVector<int> >& Path, QVector<QVector<int> >& 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<class T>
void MGraph<T>::OutputPath(QVector<int>& minpath,QVector<QVector<int> >& 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);
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时安装了多个版本(打包版本要与编辑版本一致)。