QT_校园导航Update
//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_校园导航Update的更多相关文章
- QT_校园导航(绘制路线已实现)_Updata_详细注释
//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& ...
- 各团队对《t铁大导航》评价及我组回复
组名 对我们组的建议 我组回复 (1)跑男 你们的导航前期要做到什么样的程度呢?其实我一直是很期待你们完成时我能够用你们的导航来感受一下咱们铁大校园风情.你们用了数据结构算法来找最短路径,那你们能不能 ...
- Sprint评分表
组名:第七班 姓名:王炳午 1.Cs 小分队: 项目: 游戏与办公的集合一些小的程序的整合有2048,倒计时,记 ...
- 软件项目第一个Sprint评论
团队软件评论: 极速蜗牛:个人认为,内部测试版应该是实现内容而不是UI界面,难道要让那些懂电脑的人们都去玩用户界面吗?UI界面完全可以放到beta版再进行修改,美工.不过这界面做的确实还可以.运行此游 ...
- 团队项目(NABC分析)
我们团队开发的是<校园导航>软件 (1)N(Need需求) 我们的团队主要考虑到我们学校没有自己的校园导航,有时会给同学及参观人员带来不便,又看到好多学校都有自己的导航,所以就从这个需求方 ...
- 项目结队开发---NABC分析(成员)
一.简介 项目名称:校园导航 特点:手机app,简便易用,适合对铁大地形不了解.路痴者使用. 二.NABC分析 N(need):对于新生报到,学生家长参观校园等想要了解校园路线者,本app软件将带给你 ...
随机推荐
- DOM的基本操作
什么是DOM 1:文档对象模型(DocumentObjectModel,DOM) 2:DOM定义了访问和操作HTML文档的标准方法. 3:DOM将HTML 文档表达为树结构. 其他查询元素的方法: d ...
- charCodeAt与fromCharCode
charCodeAt() 方法可返回指定位置的字符的 Unicode 编码 这个返回值是 0 - 65535 之间的整数. stringObject.charCodeAt(index) /* a-z ...
- [日常工作] Inspur 服务器安装ESXi的简单过程
1. 公司里面使用虚拟化来进行功能测试 性能测试, 现阶段和之前主要是用虚拟机来搞. 前期用过hyperV 但是感觉 没有SystemCenter的VMM的授权比较难搞一些. 所以还是用ESXi的多了 ...
- pandas重新索引
#重新索引会更改DataFrame的行标签和列标签.重新索引意味着符合数据以匹配特定轴上的一组给定的标签. #可以通过索引来实现多个操作 - #重新排序现有数据以匹配一组新的标签. #在没有标签数据的 ...
- ubuntu 环境 celery配置全解
继续尝试没有时间弄明白的技术. celery官方文档地址:http://docs.celeryproject.org/en/stable/getting-started/introduction.ht ...
- python之tkinter使用-单级菜单
# 菜单功能说明:单级菜单 import tkinter as tk root = tk.Tk() root.title('菜单选择') root.geometry('200x60') # 设置窗口大 ...
- 计算机cpu、寄存器、内存区别
1.寄存器是中央处理器内的组成部份.它跟CPU有关.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). ...
- BZOJ5306 HAOI2018染色(容斥原理+NTT)
容易想到枚举恰好出现S次的颜色有几种.如果固定至少有i种恰好出现S次,那么方案数是C(M,i)·C(N,i*S)·(M-i)N-i*S·(i*S)!/(S!)i,设为f(i). 于是考虑容斥,可得恰好 ...
- pipreqs 组件
作用 帮助你查询所有需要用的组件 安装 pip install pipreqs 使用 """ 切换到项目的路径下 执行查询当前文件下所需要的所有的组件 会生成一个 r ...
- 切割模型固定写死了切平面方程是y=0.1
上一篇讲到3d模型切割我遇到的问题(切面的纹理会混乱),经过这段时间的琢磨,有了解决方案,当然我这里只给出我的解决思路,投入到实际项目中还需要做许多工作,比如我在上一篇中切割模型固定写死了切平面方程是 ...