QT_校园导航(绘制路线已实现)_Updata_详细注释
- //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 = );
- ~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 = ;
- static const int INF = ;
- 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 (-, -, , );
- initScene();
- view = new QGraphicsView;
- view->setScene (scene);
- view->setMinimumSize (, );
- view->show ();
- setCentralWidget (view);
- createToolBar (); //实现一个工具栏
- // setCentralWidget (mapWidget);
- // setMinimumSize (600, 400); //设置最小尺寸
- }
- MainWindow::DijkstraFindPath::DijkstraFindPath()
- {
- mgraph.vexnum = ; //初始化点数目
- for (int i = ; i < mgraph.vexnum; i++) //初始化点编号
- mgraph.vexs.push_back (i);
- mgraph.arcnum = ; //暂定
- for (int i = ; i < mgraph.vexnum; i++) {
- for (int j = ; j < mgraph.vexnum; j++) {
- if (i == j)
- mgraph.arcs[i][j].adj = ;
- else
- mgraph.arcs[i][j].adj = INF;
- // mgraph.arcs[i][j].info = "";
- }
- }
- }
- void MainWindow::DijkstraFindPath::CreateGraph ()
- {
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //6 - 5
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //6 - 10
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //5 - 4
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //4 - 3
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //3 - 2
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //3 - 22
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //2 - 1
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//23 - 22
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //6 - 23
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //23 - 4
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //1 - 一食堂
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//一食堂-操场
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//一食堂-祁通1
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//祁通1-祁通2(路口)
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //一食堂-岔路口
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //岔路-7
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//一食堂到岔路(通向7号楼的)
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//岔路-祁通大道
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//祁通大道-图书馆
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//祁通大道-祁通2
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//祁通2-方肇周
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //西大门-祁通1
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//祁通1-祁通2
- // mgraph.arcs[25][12].adj = mgraph.arcs[12][25].adj = 108; //西大门-西操
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //1 - 操场
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //10 - 9
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //9 - 8
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //8 - 7
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //7 - 图书馆
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //10 - 13
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//13 - 12
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//13 - 16
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//12 - 15
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//16 - 15
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//15 - 14
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//16 - 19
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //19 - 18
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //18 - 17
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//14 - 17
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //17 - 二超
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ; //二超 - 二食堂
- mgraph.arcs[][].adj = mgraph.arcs[][].adj = ;//二食堂-图书馆
- //以下处理细节
- mgraph.arcnum = ;
- }
- void MainWindow::DijkstraFindPath::dijkstra (int startPos)
- {
- for (int i = ; i < mgraph.vexnum; i++) d[i] = INF;
- for (int i = ; i < mgraph.vexnum; i++) used[i] = false;
- for (int i = ; i < mgraph.vexnum; i++) prev[i] = -;
- d[startPos] = ;
- while (true) {
- int v = -;
- for (int u = ; u < mgraph.vexnum; u++) {
- if (!used[u] && (v == - || d[u] < d[v])) v = u;
- }
- if (v == -) break;
- used[v] = true;
- for (int u = ; u < mgraph.vexnum; u++) {
- if (d[u] > d[v] + mgraph.arcs[v][u].adj) {
- d[u] = d[v] + mgraph.arcs[v][u].adj;
- prev[u] = v;
- }
- }
- }
- }
- QVector<int> MainWindow::DijkstraFindPath::get_Path (int endPos)
- {
- QVector<int> path;
- for ( ; endPos != -; endPos = prev[endPos]) {
- // std::cout << "EndPos: " << endPos << ", ";
- path.push_back (endPos);
- }
- std::reverse(path.begin (), path.end ());
- return path;
- }
- void MainWindow::initScene ()
- {
- QGraphicsPixmapItem *item =
- scene->addPixmap (QPixmap("NanTong.jpg"));
- // item->setFlag (QGraphicsItem::ItemIsMovable);
- item->setPos (-, -);
- }
- MainWindow::~MainWindow()
- {
- }
- void MainWindow::createToolBar ()
- {
- QToolBar *toolBar = addToolBar ("Tool");
- startLabel = new QLabel(tr("起点: "));
- startComboBox = new QComboBox;
- startComboBox->addItem (tr("公寓6号楼")); //
- startComboBox->addItem (tr("公寓5号楼")); //
- startComboBox->addItem (tr("公寓4号楼")); //
- startComboBox->addItem (tr("公寓3号楼")); //
- startComboBox->addItem (tr("公寓2号楼")); //
- startComboBox->addItem (tr("公寓1号楼")); //
- startComboBox->addItem (tr("公寓10号楼")); //
- startComboBox->addItem (tr("公寓9号楼")); //
- startComboBox->addItem (tr("公寓8号楼")); //
- startComboBox->addItem (tr("公寓7号楼")); //
- startComboBox->addItem (tr("图书馆")); //
- startComboBox->addItem (tr("一食堂")); startComboBox->addItem (tr("西操场")); //11 12
- startComboBox->addItem (tr("公寓23号楼")); startComboBox->addItem (tr("公寓13号楼")); //13 14
- startComboBox->addItem (tr("公寓22号楼")); startComboBox->addItem (tr("公寓12号楼")); //15 16
- startComboBox->addItem (tr("公寓楼16")); startComboBox->addItem (tr("公寓楼15")); //17 18
- startComboBox->addItem (tr("公寓楼14")); startComboBox->addItem (tr("公寓楼19")); //19 20
- startComboBox->addItem (tr("公寓楼18")); startComboBox->addItem (tr("公寓楼17")); //21 22
- startComboBox->addItem (tr("二超")); startComboBox->addItem (tr("二食堂")); //23 24
- startComboBox->addItem (tr("西大门")); startComboBox->addItem (tr("方肇周教学楼")); //25 26
- endLabel = new QLabel(tr("\t终点: "));
- endComboBox = new QComboBox;
- endComboBox->addItem (tr("公寓6号楼"));
- endComboBox->addItem (tr("公寓5号楼"));
- endComboBox->addItem (tr("公寓4号楼"));
- endComboBox->addItem (tr("公寓3号楼"));
- endComboBox->addItem (tr("公寓2号楼"));
- endComboBox->addItem (tr("公寓1号楼"));
- endComboBox->addItem (tr("公寓10号楼"));
- endComboBox->addItem (tr("公寓9号楼"));
- endComboBox->addItem (tr("公寓8号楼"));
- endComboBox->addItem (tr("公寓7号楼"));
- endComboBox->addItem (tr("图书馆"));
- endComboBox->addItem (tr("一食堂")); endComboBox->addItem (tr("西操场"));
- endComboBox->addItem (tr("公寓23号楼"));endComboBox->addItem (tr("公寓13号楼"));
- endComboBox->addItem (tr("公寓22号楼"));endComboBox->addItem (tr("公寓12号楼"));
- endComboBox->addItem (tr("公寓楼16")); endComboBox->addItem (tr("公寓楼15"));
- endComboBox->addItem (tr("公寓楼14")); endComboBox->addItem (tr("公寓楼19"));
- endComboBox->addItem (tr("公寓楼18")); endComboBox->addItem (tr("公寓楼17"));
- endComboBox->addItem (tr("二超")); endComboBox->addItem (tr("二食堂"));
- endComboBox->addItem (tr("西大门")); endComboBox->addItem (tr("方肇周教学楼"));
- connect (startComboBox, SIGNAL(activated(int)), this, SLOT(setStartStation()));
- connect (endComboBox, SIGNAL(activated(int)), this, SLOT(setEndStation()));
- findPathBtn = new QToolButton;
- findPathBtn->setText (tr("\t\t绘制最短路径"));
- connect (findPathBtn, SIGNAL(clicked(bool)), this, SLOT(FindPath()));
- clearBtn = new QToolButton;
- clearBtn->setText (tr("\t\t清除"));
- connect (clearBtn, SIGNAL(clicked(bool)), this, SLOT(Clear()));
- toolBar->addWidget (startLabel);
- toolBar->addWidget (startComboBox);
- toolBar->addWidget (endLabel);
- toolBar->addWidget (endComboBox);
- toolBar->addWidget (findPathBtn);
- toolBar->addWidget (clearBtn);
- }
- void MainWindow::setStart(int X, int Y) {
- startX = X; startY = Y;
- // qDebug() << X << ", " << Y;
- }
- void MainWindow::setEnd (int X, int Y)
- {
- endX = X; endY = Y;
- }
- void MainWindow::setStartStation ()
- {
- switch (startComboBox->currentIndex ()) {
- case :
- setStart(-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart(-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- case :
- setStart (-, -); break;
- default:
- break;
- }
- }
- void MainWindow::setEndStation ()
- {
- switch (endComboBox->currentIndex ()) {
- case :
- setEnd(-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- default:
- break;
- }
- }
- void MainWindow::setNextPos (int index)
- {
- switch (index) {
- case :
- setEnd(-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- case :
- setEnd (-, -); break;
- default:
- break;
- }
- }
- void MainWindow::FindPath ()
- {
- //Demo 在图片上绘线 在原有基础上 (+700, +440);
- QVector<QPoint> v;
- dj->dijkstra (startComboBox->currentIndex ());
- //设置下一处的终点
- nextPath = dj->get_Path (endComboBox->currentIndex ());
- //准备绘制
- Clear ();
- //将路线绘制下来
- QGraphicsPathItem *item = new QGraphicsPathItem();
- QPen pen;
- pen.setWidth ();
- pen.setColor (Qt::red);
- item->setPen (pen);
- item->setFlag (QGraphicsItem::ItemIsPanel);
- // qDebug() << startX << " " << startY << " " << endX << " " << endY;
- // qDebug() << "Hello World !";
- //设置起点
- // v << QPoint(startX + 700, startY + 440);
- for (int i = ; i < nextPath.size (); i++) {
- qDebug() << nextPath[i] << " , ";
- }
- scene->addItem (item);
- QPainterPath pa; //path
- // setNextPos (nextPath[1]);
- // item->setLine (startX + 700, startY + 440, endX + 700, endY + 440);
- pa.moveTo (startX + , startY + );
- for (int i = ; i < nextPath.size() ; i++) {
- setNextPos (nextPath[i]);
- pa.lineTo (endX + , endY + );
- }
- item->setPath (pa);
- }
- void MainWindow::Clear ()
- {
- QList<QGraphicsItem*> listItem = scene->items ();
- while (!listItem.empty ())
- {
- scene->removeItem (listItem.at ());
- listItem.removeAt ();
- }
- QGraphicsPixmapItem *item =
- scene->addPixmap (QPixmap("NanTong.jpg"));
- // item->setFlag (QGraphicsItem::ItemIsMovable);
- item->setPos (-, -);
- }
- void MainWindow::paintEvent (QPaintEvent *)
- {
- }
- //Main.cpp
- #include "mainwindow.h"
- #include "mapwidget.h"
- #include <QApplication>
- #include <QFont>
- #include <QDebug>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QFont font("ARPL KaitiM GB", );
- font.setBold (true);
- a.setFont (font);
- qDebug() << "Run............";
- MainWindow w;
- w.show ();
- return a.exec();
- }
QT_校园导航(绘制路线已实现)_Updata_详细注释的更多相关文章
- QT_校园导航Update
//MainWidget.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include " ...
- QT_地图导航 源码下载
https://github.com/douzujun/MyMapView 主要算法讲解: 1. 计算最短路径(dijkstra算法) Step1: (1)找到最短路径已经确定的顶点,从它已经确定的顶 ...
- 从CUMT校园导航出现的问题看CSS布局设计(一) CSS盒模型
先说说做的这个校园导航系统值得一提的内容: 1. 二级菜单栏 .iframe内嵌窗口(样式设计.用hover做效果) 2. 高德地图API (自定义底图样式.弹跳点.信息窗体.线路导航) 3. DO ...
- QT_地图导航
//地图显示功能 #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QGraphicsView> #include <QLabel& ...
- Android开发技巧——实现底部图标文字的导航栏(已更新)
本文章的导航栏代码参考了viewpagerindicator的实现.本文叙述的是之前版本的qq或微信中,底部的图标加文字的导航栏的实现. 2014-09-14 13:59:42更新:library的代 ...
- Luogu-P1027 Car的旅行路线 已知三点确定矩形 + 最短路
传送门:https://www.luogu.org/problemnew/show/P1027 题意: 图中有n个城市,每个城市有4个机场在矩形的四个顶点上.一个城市间的机场可以通过高铁通达,不同城市 ...
- git修改已提交记录的注释
已提交暂存区但还未提交远端仓库 命令:git commit --amend -m 已提交远端仓库 命令:git rebase 可以参考:http://www.cnblogs.com/dudu/p/47 ...
- Android之View绘制流程开胃菜---setContentView(...)详细分析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 1 为什么要分析setContentView方法 作为安卓开发者相信大部分都有意或者无意看过如下图示:PhoneWindow,DecorView这些 ...
- SVN修改已提交版本的注释
SVN提交文件后,发现注释写的不完整或不够明确,想再修改注释文字.通过View Project History dialog修改完成后,在提交时遇到如下错误:Repository has not be ...
随机推荐
- PHP小记录
正的framework(大量使用) thinkphp(部分使用) cakephpyii(极少使用) [一]函数 1:函数的声明:每个函数的第一行都是函数开头,有声明函数的关键 ...
- NodeJS加MongoDB应用入门
OS:Windows 7 1.下载安装MongoDB:http://www.mongodb.org/downloads 2.下载安装NodeJS:http://nodejs.org/ 3.运行Mong ...
- typedef与define基本使用
参考: typedef用法 http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html#define用法:http://blog. ...
- Forget asp.net membership,ASP.NET Identity Overview
http://www.asp.net/identity http://www.asp.net/identity/overview/getting-started/introduction-to-asp ...
- C++引用之声明方法
引用就是某一变量的一个别名,对引用的操作就是对目标的操作. 引用的声明方法: 类型标识符 &引用名=目标变量名: 如: int a; int &ra=a; //定义引用ra,他是变量a ...
- 标准MD5加密算法
标准MD5加密算法: public class Md5 { public static String getMd5(String s) { char hexDigits[] = { '0', '1', ...
- 17.1.4 Replication and Binary Logging Options and Variables 复制和Binary logging 选项和变量
17.1.4 Replication and Binary Logging Options and Variables 复制和Binary logging 选项和变量 下面的章节包含信息关于mysql ...
- 如何实现Android重启应用程序代码 ?
Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPack ...
- King(差分约束)
http://poj.org/problem?id=1364 题意真心看不大懂啊... 现在假设有一个这样的序列,S={a1,a2,a3,a4...ai...at}其中ai=a*si,其实这句可以忽略 ...
- 《华油能源OA系统数据同步和扩展的设计与实现_张宇峰》阅读笔记
为什么我会找到这篇论文? 华油能源集团拥有多套信息化软件系统,每个用户需要登录操作多个软件系统,记住多个系统的用户名.密码,需要不停的切换到每个系统,查看是否有需要进行的工作:管理员更是疲于每天对各个 ...