Qt地铁智慧换乘系统浅学(四 )实现添加线路,添加站点,添加边 并且存储到本地txt文件

news/2024/11/30 7:53:22/

玩的就是添加

  • 添加前的构思
  • 界面设计
    • tabWidget
      • 添加线路界面
      • 添加站点界面
      • 添加边界面
  • 代码实现
    • 添加线路
      • 思路
      • 连接槽函数
      • 槽函数
    • 添加站点
      • 思路
      • 连接槽函数
      • 初始化combox
      • 槽函数
      • 更新容器函数
    • 添加边
      • 思路
      • 槽函数 和代码
  • 注意

添加前的构思

假设 现要添加一个线路 : 9号线

如果你将它存在初始化的txt文件中,类似以下的形式
在这里插入图片描述
这个时候 站点都是未知的,每次插入站点维护都很麻烦!

于是我们新建一个txt文件 用来存储新添加的站点,并且添加之后维护到程序运行的存储结构中
文本内容如下

线路名称 线路颜色

在维护的时候 之间

LineColor[线路名称] = QColor( 线路颜色) 即可

注意 我们需要判断线路是否存在,以及颜色是否存在 进行特判

假如 我们要添加站点呢?
我们添加的信息是

站点名称 站点所属线路 东经 北纬

同样的 如果将这个信息存储到初始化里面,我们并不知道他所在的顺序,因为初始化文件里都是顺序存储,建边需要!
所以 我们需要单独存储到addstation.txt 文件里,格式如上
我们在初始化完成之后 ,再额外初始化咱们添加的这些站点即可 ,将他们画在地图上

添加边的话 ,我们输入的信息是 起始站,终点站,所属线路
同样的 也不好添加到初始化文件中

我们也是新建一个文本文件 addedge.txt
格式如输入的那样

然后初始化之后 我们额外初始化咱们的边即可

界面设计

tabWidget

添加线路界面

在这里插入图片描述

添加站点界面

在这里插入图片描述

添加边界面

在这里插入图片描述

代码实现

添加线路

思路

输入线路名称,和选择颜色。
判断线路是否存在,
判断颜色是否存在
合理 更新容器和txt

连接槽函数

connect(ui->pushButtonAddLine,&QPushButton::clicked,this,[=]{addLine();}); //添加线路的槽
connect(ui->pushbuttongetcolor,&QPushButton::clicked,this,[=]{getcolor();}); //用来选择线路颜色

槽函数

void addMenu::getcolor(){this->color=QColorDialog::getColor(Qt::white,this);ui->pushbuttongetcolor->setStyleSheet(QString("background-color:rgb(%1,%2,%3)").arg(color.red()).arg(color.green()).arg(color.blue()));qDebug()<<this->color;this->flag = 1;
}void addMenu::addLine(){ui->textBrowser->clear();QString name = ui->lineEdit->text();if(name.size()==0){QMessageBox MyBox(QMessageBox::Warning,"警告","请输入线路名称.",QMessageBox::Close);MyBox.exec();this->flag=0;return ;}if(!this->flag){QMessageBox MyBox(QMessageBox::Warning,"警告","请选择颜色.",QMessageBox::Close);MyBox.exec();this->flag=0;return ;}QMap<QString, QColor>::iterator it =LineColor.find(name);
//    for(auto i:LineColor.keys()){
//        qDebug()<<i<<"\n";
//    }if (it != LineColor.end()) {qDebug()<<name<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","请不要输入相同线路.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}while(!this->flag){};bool exists = false;for (const auto pair : LineColor.values()) {if (pair == this->color) {exists = true;break;}}if(exists){QMessageBox MyBox(QMessageBox::Warning,"警告","请不要选择已经存在的颜色.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}QFile linefie("../testgitee/test/addline.txt");/*  addline.txtlinename linecolor
*/linefie.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);if(!linefie.isOpen()){qDebug()<<"error open"<<linefie.errorString();this->flag = 0;return ;}QTextStream stream(&linefie);stream.setCodec("UTF-8");if (linefie.size() > 0) {linefie.seek(linefie.size() - 1); // 移动到倒数第二个字符,忽略换行符while (!stream.atEnd()) {QString line = stream.readLine();}}stream<<name<<" "<<this->color.name()<<endl;linefie.close();LineColor[name] = this->color;initcombox1();ui->textBrowser->append("线路"+name+"插入成功"+" 颜色"+this->color.name());
}

添加站点

思路

我们输入站点的名称,站点所属线路,以及站点的经纬度

判断站点是否存在,判断线路是否存在
合理 添加到txt文件 并且更新容器

连接槽函数

connect(ui->pushButtonaddsta,&QPushButton::clicked,this,[=]{addstation();});

初始化combox

这里放置了添加tabwidget的所有combox

void addMenu::initcombox1(){void addMenu::initcombox1(){ui->comboBox->clear();QStringList Line_list,Line_list1;for(auto &i:LineColor.keys()){Line_list.append(i);Line_list1.append(i);}std::sort(Line_list.begin(),Line_list.end(),[](const QString &s1, const QString &s2){return (s1.localeAwareCompare(s2) < 0);});std::sort(Line_list1.begin(),Line_list1.end(),[](const QString &s1, const QString &s2){return (s1.localeAwareCompare(s2) < 0);});ui->comboBox->addItems(Line_list);  //添加站点中 选择线路QLineEdit *line1 = new QLineEdit;ui->comboBox->setLineEdit(line1);ui->comboBox->lineEdit()->clear();//qDebug()<<"1错误";ui->comboBox_4->clear();ui->comboBox_4->addItems(Line_list1);  //添加边时 所属线路QLineEdit *line2 = new QLineEdit;ui->comboBox_4->setLineEdit(line2);ui->comboBox_4->lineEdit()->clear();//qDebug()<<"2错了";QStringList sta_name,sta_name1;for(auto &i:Station.keys()){sta_name.append(i);sta_name1.append(i);}std::sort(sta_name.begin(),sta_name.end(),[](const QString &s1, const QString &s2){return (s1.localeAwareCompare(s2) < 0);});std::sort(sta_name1.begin(),sta_name1.end(),[](const QString &s1, const QString &s2){return (s1.localeAwareCompare(s2) < 0);});ui->comboBox_2->clear();    // 添加边时 起始站点ui->comboBox_2->addItems(sta_name);QLineEdit *line3 = new QLineEdit;ui->comboBox_2->setLineEdit(line3);ui->comboBox_2->lineEdit()->clear();
//qDebug()<<"3错了";ui->comboBox_3->clear();ui->comboBox_3->addItems(sta_name1);  //添加边时  终点站QLineEdit *line4 = new QLineEdit;ui->comboBox_3->setLineEdit(line4);ui->comboBox_3->lineEdit()->clear();}

槽函数

void addMenu::addstation(){QString staname = ui->lineEdit_2->text();if(staname.size()==0){QMessageBox MyBox(QMessageBox::Warning,"警告","请输入站点.",QMessageBox::Close);MyBox.exec();this->flag=0;return ;}QMap<QString, node>::iterator its =Station.find(staname);//    for(auto i:LineColor.keys()){//        qDebug()<<i<<"\n";//    }if (its != Station.end()) {qDebug()<<"站点已经存在: "<<staname<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","站点已经存在.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}QString linename = ui->comboBox->lineEdit()->text();  //判断线路是否存在QMap<QString, QColor>::iterator it =LineColor.find(linename);//    for(auto i:LineColor.keys()){//        qDebug()<<i<<"\n";//    }if (it == LineColor.end()) {qDebug()<<"不存在线路: "<<linename<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","请选择存在的线路.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}bool exits = false;for(auto i:Station_Line[staname]){if(i==linename){exits = true;}}if(exits){qDebug()<<"该线路已经存在站点:"<<linename<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","该线路已经存在站点.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}QFile linefie("../testgitee/test/addstation.txt");/*  addstation.txtstation   line   E  N
*/linefie.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);if(!linefie.isOpen()){qDebug()<<"error open"<<linefie.errorString();this->flag = 0;return ;}QTextStream stream(&linefie);stream.setCodec("UTF-8");if (linefie.size() > 0) {linefie.seek(linefie.size() - 1); // 移动到倒数第二个字符,忽略换行符while (!stream.atEnd()) {QString line = stream.readLine();}}stream<<staname<<" "<<linename<<" "<<ui->doubleSpinBox->text()<<" "<<ui->doubleSpinBox_2->text()<<endl;linefie.close();ui->textBrowser_2->append("站点"+staname+"添加成功"+" 线路"+linename);infoaddstation();}

更新容器函数


void infoaddstation(){QFile linefie("../testgitee/test/addstation.txt");
/**  addstation.txt*  stationname linename e n
*/linefie.open(QIODevice::ReadOnly);if(!linefie.isOpen()){qDebug()<<"error open";return ;}QString stationname;QString linename;QTextStream linein(&linefie);linein.setCodec("UTF-8");node stal;while(true){linein>>stal.name>>linename>>stal.n>>stal.e;if(linein.atEnd()) break;updateBound(stal.e,stal.n);qDebug()<<stal.name<<stal.n<<stal.e<<"\n";qDebug()<<maxLati<<" "<<maxLongi<<" "<<minLati<<" "<<minLongi<<"\n";stal.coord.setY((maxLati-stal.e)/(maxLati-minLati)*500+100);stal.coord.setX((stal.n-minLongi)/(maxLongi-minLongi)*1000+100);Station[stal.name] = stal;Station_Line[stal.name].insert(linename);}linefie.close();
}

添加边

思路

起始站 终点站 所属线
分别判断是否存在

合理则更新txt和容器

槽函数 和代码

void addMenu::addedge(){QString sta1,sta2,linename;sta1 = ui->comboBox_2->lineEdit()->text();sta2 = ui->comboBox_3->lineEdit()->text();linename = ui->comboBox_4->lineEdit()->text();if(sta1.size()==0 || sta2.size()==0 ||linename.size()==0){QMessageBox MyBox(QMessageBox::Warning,"警告","请输入完整信息.",QMessageBox::Close);MyBox.exec();}QMap<QString, node>::iterator its =Station.find(sta1);if (its == Station.end()) {qDebug()<<"站点1不存在: "<<sta1<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","站点1不存在.",QMessageBox::Close);MyBox.exec();return;}its =Station.find(sta2);if (its == Station.end()) {qDebug()<<"站点2不存在: "<<sta1<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","站点2不存在.",QMessageBox::Close);MyBox.exec();return;}QMap<QString, QColor>::iterator it =LineColor.find(linename);//    for(auto i:LineColor.keys()){//        qDebug()<<i<<"\n";//    }if (it == LineColor.end()) {qDebug()<<"不存在线路: "<<linename<<"\n";QMessageBox MyBox(QMessageBox::Warning,"警告","请选择存在的线路.",QMessageBox::Close);MyBox.exec();this->flag=0;return;}// 将信息添加到txt文件QFile linefie("../testgitee/test/addedge.txt");/*  addedge.txtstation1 station2  linename
*/linefie.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);if(!linefie.isOpen()){qDebug()<<"error open"<<linefie.errorString();this->flag = 0;return ;}QTextStream stream(&linefie);stream.setCodec("UTF-8");if (linefie.size() > 0) {linefie.seek(linefie.size() - 1); // 移动到倒数第二个字符,忽略换行符while (!stream.atEnd()) {QString line = stream.readLine();}}stream<<sta1<<" "<<sta2<<" "<<linename<<endl;linefie.close();infoaddedge();QMessageBox MyBox(QMessageBox::Information,"信息","成功添加边:"+sta1+"<---"+linename+"--->"+sta2,QMessageBox::Close);MyBox.exec();
}
void infoaddedge(){QFile linefie("../testgitee/test/addedge.txt");/**  addedge.txt*  sta1 sta2 linename
*/linefie.open(QIODevice::ReadOnly);if(!linefie.isOpen()){qDebug()<<"error open";return ;}QString sta1name,sta2name;QString Linename;QTextStream linein(&linefie);linein.setCodec("UTF-8");while(true){linein>>sta1name>>sta2name>>Linename;if(linein.atEnd()) break;edge[sta1name].append(sta2name);edge[sta2name].append(sta1name);dp[sta1name][sta2name] = dp[sta2name][sta1name] = getDistance(sta1name,sta2name);mp[sta1name][sta2name].insert(Linename);mp[sta2name][sta1name].insert(Linename);}linefie.close();
}

注意

需要注意的是,在初始化阶段infoaddline ,infoaddstation,infoaddedge也是要执行的,在Qt地铁智慧换乘系统浅学(二 )中没有体现

其实就是在infoinit执行完成后执行这三个函数即可

    //addlineinfoaddline();//addstationinfoaddstation();//addedgeinfoaddedge();

在这里插入图片描述
左上角即添加的站点和线路


http://www.ppmy.cn/news/1129196.html

相关文章

AI算法+视频技术助力构建智慧城管解决方案,实现城市管理精细化

一、背景分析 物联网、大数据、移动互联网等技术的日新月异&#xff0c;城市管理对信息资源需求的日益提升&#xff0c;广大市民对政府服务新的诉求&#xff0c; 智慧城管正面临千载难逢的发展机遇。 发展历程&#xff1a; 1&#xff09;数字城管&#xff1a;城市管理机制的…

2.物联网射频识别RFID

一。RFID无线识别的原理 1.RFID系统无线通信基本原理 标签&#xff1a;&#xff08;卡&#xff09; 读写器&#xff1a;&#xff08;刷卡机&#xff09; 无源RFID标签如何取电 2.读写器与标签之间的无线电波交互方式 补充&#xff1a;RFID按频段分类 我们可以看到工作原理是电…

贝锐蒲公英异地组网:无需专线,也能解决无公网固定IP问题

为了简化部署、运维实现更高的易用性&#xff0c;或是满足用户的特定需求&#xff0c;基于SD-WAN全自研的贝锐蒲公英异地组网拥有众多实用功能。这些功能涵盖网络、用户交互等诸多方面&#xff0c;包括&#xff1a;旁路组网模式、自定义网络出口/虚拟IP/DNS域名解析、WebVPN、企…

WebGL笔记:WebGL中绘制圆点,设定透明度,渲染动画

WebGL 绘制圆点 基于片元着色器来画圆形片元着色器在屏幕中画图是基于一个个的像素的每次画一个像素时&#xff0c;都会执行片元着色器中的main方法那么&#xff0c;我们就可以从这一堆片元中(n个像素点)找出属于圆形的部分片元的位置叫做 gl_PointCoord (一个点中片元的坐标位…

计算机视觉 回头重新理解图像中的矩

一、人类的欲望 图像中的矩是一个十分古老的话题,这个东西的出现始于人类的欲望,想要找到一种自动且强大的图像分析方法。 比如我们要在图像中识别某一个物体,而这个物体在不同的成像条件下,表现出的高矮胖瘦方向位置颜色都不可能完全一致,这就为识别带来了巨大的困难,但…

照片后期处理软件DxO FilmPack 6 mac中文说明

DxO FilmPack 6 for Mac是一款照片后期处理软件。它可以模拟超过60种著名胶片品牌和类型的色彩和颗粒感&#xff0c;使照片具有复古、艺术和时尚风格。 ​DxO FilmPack 6 mac支持RAW和JPG格式的照片&#xff0c;并提供丰富的调整选项&#xff0c;如亮度、对比度、曝光、阴影和高…

使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件

系列文章目录 创建 gstreamer 插件的几种方式 使用 gst-template 创建自己的 gstreamer 插件 使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件 文章目录 系列文章目录前言一、获取gst-plugins-bad 源码二、gst-plugins-bad 相关的软件依赖1. 根据自己的…

PY32F003F18之RTC

一、RTC振荡器 PY32F003F18实时时钟的振荡器是内部RC振荡器&#xff0c;频率为32.768KHz。它也可以使用HSE时钟&#xff0c;不建议使用。HAL库提到LSE振荡器&#xff0c;但PY32F003F18实际上没有这个振荡器。 缺点&#xff1a;CPU掉电后&#xff0c;需要重新配置RTC&#xff…