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

news2024/12/22 22:14:19

玩的就是添加

  • 添加前的构思
  • 界面设计
    • 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.txt
    linename 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.txt
    station   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.txt
   station1 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执行完成后执行这三个函数即可

    //addline
    infoaddline();
    //addstation
    infoaddstation();
    //addedge
    infoaddedge();

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[H5动画制作系列 ]帧代码运行顺序测试

刚开始接触Animate CC&#xff08;过去叫&#xff1a;Flash&#xff09;,对于帧代码的执行顺序十分迷惑。所以,专门做一个简单代码顺序测试. 准备工作: 代码图层actions&#xff0c;第1帧和第10帧为关键帧。 背景图层bg&#xff0c;就一个字符串红色Test.界面如下: 代码测试步…

八个不可不知的SQL高级方法

结构化查询语言&#xff08;SQL&#xff09;是一种广泛使用的工具&#xff0c;用于管理和操作数据库。基本的SQL查询简单易学&#xff0c;但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数&#xff0c;使您能够对数据执行复杂…

Zero-Shot Learning by Harnessing Adversarial Samples 理论 代码解读

《Zero-Shot Learning by Harnessing Adversarial Samples》基于对抗样本的零样本学习 该论文要解决的问题&#xff1a; 减轻了传统图像增强技术中固有的语义失真问题。我们希望我们的实验研究将有助于理解单标签监督和语义属性监督在模型行为上的差异&#xff0c;并为开发更…

10.01

服务器 #include<myhead.h> //键盘输入事件 int keybord_events(fd_set readfds) {char buf[128] "";int sndfd -1; //从终端获取一个文件描述符&#xff0c;发送数据给该文件描述符对应的客户端bzero(buf, sizeof(buf));int res scanf("…

Junit的常用操作

注:本篇文章讲解的是junit5 目录 Juint是什么 Juint需要导入的依赖 Juint常用注解 Junit执行顺序 参数化 断言 测试套件 Juint是什么 Juint 是 Java 的一个单元测试框架. 也是回归测试框架. 使用 Junit 能让我们快速的完成单元测试。 注意&#xff1a;Junit 测试也是程序…

网络安全渗透测试工具之skipfish

网络安全渗透测试工具skipfish介绍 在数字化的时代,Web 应用程序安全成为了首要任务。想象一下,您是一位勇敢的安全冒险家,迎接着那些隐藏在 Web 应用程序中的未知风险。而在这个冒险之旅中,您需要一款强大的工具来帮助您发现漏洞,揭示弱点。而这个工具就是 Skipfish。 …

【Android】安卓手机系统内置应用安装失败解决方案

现有的闲置手机有个内置app可老旧了&#xff0c;没有开发者维护&#xff0c;于是问题不断&#xff0c;影响了体验&#xff0c;后来在网上查找发现有它的新版本&#xff0c;想要更新却没有自动更新&#xff08;后台服务断开了&#xff09;&#xff0c;有类似的想法可以来这里了解…

国庆创作周 组播《第十二课》

国庆创作周《第十二课》图解

实现单行/多行文本溢出

在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示&#xff0c;超出…

Blued引流脚本

于多数人来说&#xff0c;引流都是一个比较困难的操作&#xff0c;因为流量不会听你的。所以任何人在网上做生意&#xff0c;或者开一个实体店&#xff0c;都会为流量而发愁&#xff0c;其实对于流量的吸引来说&#xff0c;我们越是刻意为之&#xff0c;可能所获得的效果也越不…

基于Java的在线听歌平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录 一、消息队列是什么&#xff1f;二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么&#xff1f; 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…

国庆作业2

select实现服务器并发 代码&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…

格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断(Python代码,CNN模型)

1.运行效果&#xff1a;格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断&#xff08;Python代码&#xff0c;CNN模型&#xff09;_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提…

崇州街子古镇中秋国庆热闹非凡

今天&#xff08;国庆节日&#xff09;下午约4点钟&#xff0c;笔者实在耐不住寂寞&#xff0c;走出寄居养老的成都市崇州街子古镇青城神韵小区&#xff0c;去到国家AAAA级旅游景区那古色古香的街子古镇街道&#xff0c;旨在要亲身感受一下今年这里过双节&#xff0c;气氛究竟会…

28294-2012 钢渣复合料 课堂随笔

声明 本文是学习GB-T 28294-2012 钢渣复合料. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了混凝土用钢渣复合料的术语和定义、原材料组成及要求、强度等级、技术要求、试验方 法、检验规则、包装、标识、运输与贮存。 本标准…

WinHex数据恢复方法(误删后没覆盖)

winhex永远滴神&#xff01;winhex永远滴神&#xff01;winhex永远滴神&#xff01; md&#xff0c;安卓手机插u盘&#xff0c;改个文件夹名竟然把整个文件夹搞没了&#xff01;于是我赶紧查怎么恢复&#xff0c;然后依次找到并试用了diskgenus&#xff08;410RMB&#xff09;、…

信息安全:使用程序编写基于密钥的加密方式

目录 前言RSA算法代码实现设计思路结果示意 Diffie-Hellman算法代码实现设计思路结果示意 前言 信息安全是计算机科学的一个重要分支&#xff0c;它涉及到保护信息的机密性、完整性和可用性。信息加密是信息安全的一种常用手段&#xff0c;它通过使用一些数学算法和密钥&#…

P1525 [NOIP2010 提高组] 关押罪犯(并查集)

[NOIP2010 提高组] 关押罪犯 题目描述 S 城现有两座监狱&#xff0c;一共关押着 N N N 名罪犯&#xff0c;编号分别为 1 − N 1-N 1−N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久&#xff0c;如果客观条件具备则随时可能爆发冲突。我们用“怨气值”&#x…

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…