项目介绍:

1. 地铁站点路线显示

从本地文件中读取地铁线路站点数据,并在 Qt 界面中显示地铁路线及站点。当鼠

标悬浮在地铁站点上时,显示站点详细信息;实现界面的缩小放大。

2. 添加新地铁线路及站点

新地铁线路开通时,可以手动添加新开通的地铁线路到系统中;可以手动添加站

点到新旧地铁路线中。

3. 地铁最少换乘次数路线查询

查询出从起点站到终点站换乘次数最少的乘车路线。

4. 地铁最少时间换乘路线查询

查询出从起点站到终点站用时最少的乘车路线。

5. 帮助文档

帮助文档可以帮忙使用者快速的了解软件的使用方法。


一、主界面布局

  • QGraphicsView详解
  • Qt 使用-自定义菜单栏

二、地铁信息存储

1、学习数据结构中图的存储。

图的存储方法有好几种,如邻接矩阵法,邻接表法,十字链表法,邻接多重表。当一个图为稀疏图时,使用邻接矩阵会浪费大量存储空间。邻接表法结合了顺序存储和链式存储方法,减少了不必要的浪费。

邻接表(Adjacency List) 是图的一种链式存储结构,在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。每个节点由3个域组成,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个表头节点。在表头节点中,除了设有链域(firstarc)指向链表中的第一个节点之外,还设有存储顶点Vi的名或者其他有关信息的数据域(data)。

在构建图时,需要两个结构体,一个存储图中节点的信息,便是上面介绍的头节点,一个是两个节点之间边的信息,便是上面的表(边)节点。 采用一个一维数组存储头结点信息,然后为每个头结点建立一个链表,让头结点作为这个链表的表头节点(具体实现方法便是让头结点内的指针firstarc 指向链表的首地址),链表中存储的正是和这个头结点相关联的表节点(边的信息),这些边都是尾部和头结点相连。表节点中的adjvex存储的是与这条边关联的另一个头结点在数组中的索引(边的箭头所关联的头节点),表节点中的nextarc则是存储的该链表表头相关联的另一条边的信息。

2、选择合适的容器

地铁站点、路线完全符合图的数据结构,所以地铁站点、路线的存储可以参考图的邻接表的存储结构,参考下图:

容器存储:

所以该项目采用的容器为:

//存储所有站点信息,用stations的索引作为站点的唯一索引

QVector<Station>stations;

//<站点名,站点在stations中的索引>

QHash<QString, int> stationsHash;

//graph[i]代表stations[i]站点的头结点

// graph[i]容器内存储的是与stations[i]站点相连的站点的唯一索引

QVector<QVector<Node>>graph;

三、读取地铁线路信息

  • QSqlQuery简单使用

导入数据库信息后,将各个站点信息遍历,存储到line中,再利用函数生成图结构。

//生成图结构
void SubwayGraph::makeGraph()
{graph.clear();graph=QVector<QVector<Node>>(stations.size(), QVector<Node>());for (auto &a : edges){double dist=stations[a.first].distance(stations[a.second]);graph[a.first].push_back(Node(a.second, dist));graph[a.second].push_back(Node(a.first, dist));}
}

Qt实训:SubwayTransferSystem(一)相关推荐

  1. Qt实训项目----(1)

    Qt实训项目----(1) 1. 创建窗体工程mainwindow,并且在窗体绘画区域内加载并显示图片: 2. 在工具栏中添加绘图工具,点击后由默认图标变为"+"图标,并且能使用操 ...

  2. QT专业技能实训-富文本编辑器

    目录 1 概述 1.1 专业技能实训目的与要求 1.2 项目背景 1.2.1 项目知识背景 1.2.2 项目设计背景 2 需求分析 2.1软件需求 2.1.1设计需求 2.1.2功能需求 2.2用户需 ...

  3. 【项目实训】基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云)

    [项目实训]基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云) 一.环境介绍 二.签到功能 2.1 启动签到 2.2 结束签到 三.用户组操作 3.1 添加用户组 3. ...

  4. Android新闻客户端实训-Day1类Day2接口基操

    结束了一些事情,本以为可以好好玩一段时间,结果紧接着又来了Android实训,因为这个实训已经开了一段时间了,我中途加入已经不赶趟了,但出于兴趣,准备今天开始跟着老师的笔记的源码从头开始自己摸索着学一 ...

  5. 一个简单的员工薪资管理系统(大一\二实训课)

     废话: 今天是10月19号..抽时间把代码更新了一下,不知为何突发奇想,又添加了了一个薪资状况概览的小功能. 本来想直接用Qt修代码发桌面版的,,奈何Qt才学了两天完全修不了,,只能发普通的控制台版 ...

  6. 实训日记五 完善ui组件代码

    第五天,用Qt设计完ui生成.py文件,创建main.py文件编写组件代码. 七.图形用户界面 使用PyUIC工具进行转换,ui生成.py文件. 创建主程序文件 import sys import d ...

  7. 物联网智能家居实训系统

    物联网智能家居实训系统 产品型号和技术规格 系统概述 物联网智能家居实训系统,以智能家居行业为背景,对智能家居中多个子系统进行安装调试操作,培养学生的工程技能,使其能够搭建相对复杂的物联网应用系统,并 ...

  8. 湖南大学python头歌实训-循环语句

    文章目录 第二章-Python语言基础-2.3循环(一) 第1关:While循环与break语句 第2关:for循环※ 第3关:for循环与continue语句 第4关:循环嵌套 第5关:迭代器 第二 ...

  9. 视频教程-C++微服务架构及安全云盘项目实训-C/C++

    C++微服务架构及安全云盘项目实训 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算机视觉,嵌入式图像处理,云安全审 ...

最新文章

  1. c++语言程序设计案...,C++程序设计案.ppt
  2. 数据库70多张表设计的一些思考…
  3. 不用电脑怎么设置苹果铃声_苹果手机怎么设置铃声?完整教程分享
  4. pycharm创建scrapy项目
  5. Java常用数据类型
  6. jquery加载完成后方法只执行一次_JavaScript的超级库--jQuery内容整理(3)
  7. Vue-cli proxyTable 解决开发环境的跨域问题
  8. JavaScript表单编程
  9. 微信小程序抖音实战-支持手机播放小视频
  10. 【keil/MDK5】编译生成bin文件和汇编文件
  11. oracle双机热备 rose,linux下使用RoseHa实现oracle双机热备.doc
  12. tensorflow,pytorch中normalize方法
  13. java让字体闪动_java 字体闪烁
  14. typora+PicGo-Core+smms上传图床
  15. Win32设计图标、光标样式和窗口标题(简单易懂)
  16. CAD梦想画图中的“绘图工具——椭圆弧”
  17. 如何监控工程项目进度?
  18. java 生成ppt_POI之PPT导出最简单实例
  19. Adobe国际认证证书对职业应聘有用吗?
  20. Android 边播放边缓存视频框架:AndroidVideoCache简析

热门文章

  1. 京东物流与圆通纷纷发力后 高端个人寄件领域将会出现怎样的变化?
  2. 直流分流器 shunt 电阻
  3. 阿拉伯语软件的 GUI 设计
  4. linux远程 java jar包_给Linux服务器远程安装jdk
  5. 聚齐三只SQL圣兽,玩转增删改查创建表,横扫sql补充练习题
  6. 前端项目使用高德API,创建地图,撒点,自定义标记点样式,点击点位展示信息提示窗体
  7. 智能合约审计之evilReflex攻击
  8. html5 照片汇聚logo,利用HTML5实现Canvas粒子汇聚文字特效
  9. 微软和苹果、Google站在一起:HTML5才是互联网的未来
  10. Arduino uno 板各脚的作用