QT实现校园导航
导航是地图类项目实战中经常会遇到了。看上去貌似没头绪,其实是有模板遵循的。我们直接根据图看代码。
//MainWidget.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "mapwidget.h"
#include <QToolButton>
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QLabel>
#include <QComboBox>
#include <QSpinBox>
#include <QTextEdit>
#include <QPainter>
#include <QVector>class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = 0);~MainWindow();void createToolBar();void paintEvent (QPaintEvent *);void setStart(int X, int Y);void setEnd(int X, int Y);void setNextPos (int index);void initScene();
public slots:void setStartStation();void setEndStation();void FindPath();void Clear();
private:MapWidget *mapWidget;QLabel *startLabel;QLabel *endLabel;QComboBox *startComboBox;QComboBox *endComboBox;QToolButton *findPathBtn;QToolButton *clearBtn;QGraphicsScene *scene;QGraphicsView *view;int startX, startY, endX, endY;QVector<int> nextPath;struct ArcCell{ //弧信息int adj; //对无权图有1,0表示是否相邻,对带权图,则为权值类型// string info; //该弧的相关信息};//内部类static const int MAX_VERTEX_NUM = 31;static const int INF = 999999;struct MGraph{QVector<int> vexs; //顶点集合//临接矩阵ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vexnum; //顶点数int arcnum; //边数// int kind; //图的类型};class DijkstraFindPath{public:DijkstraFindPath();MGraph mgraph;void CreateGraph();
// void ShortestPath(int v0, PathMatrix &path, ShortPathTable &DP, int prev[]);int prev[MAX_VERTEX_NUM]; //最短路上的前驱顶点int d[MAX_VERTEX_NUM]; //表示边e = (u,v)的权值(不存在时为INF,不过d[i][i]=0)bool used[MAX_VERTEX_NUM]; //已经使用过的图void dijkstra(int startPos); //求从起点startPos出发到各个顶点的最短距离QVector<int> get_Path(int endPos);//到顶点endPos的最短路};DijkstraFindPath *dj;
};#endif // MAINWINDOW_H
//MainWidget.cpp
//最短路径算法,和界面的实现#include "mainwindow.h"
#include <qdebug.h>
#include <QToolBar>
#include <QtAlgorithms>
#include <iostream>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
// mapWidget = new MapWidget;
// painter = new QPainter();dj = new MainWindow::DijkstraFindPath();dj->CreateGraph ();scene = new QGraphicsScene;scene->setSceneRect (-100, -100, 700, 700);initScene();view = new QGraphicsView;view->setScene (scene);view->setMinimumSize (800, 800);view->show ();setCentralWidget (view);createToolBar (); //实现一个工具栏
// setCentralWidget (mapWidget);
// setMinimumSize (600, 400); //设置最小尺寸
}
MainWindow::DijkstraFindPath::DijkstraFindPath()
{mgraph.vexnum = 31; //初始化点数目for (int i = 0; i < mgraph.vexnum; i++) //初始化点编号mgraph.vexs.push_back (i);mgraph