C++课程设计:基于Qt的航班信息管理系统

目录

源码下载链接:

第一章 航空机票订票系统描述

1.1 具体题目

1.2 开发技术栈

1.3 需求分析

1.4界面迁移逻辑

 第二章 运行结果

4.1用户有关界面

4.1.1用户登陆界面

4.1.2用户查询界面

4.1.3用户订票界面

4.1.4用户改签界面

4.1.5退票界面

4.2管理员有关界面

4.2.1管理员登录界面

4.2.2管理员添加航班界面

4.3文件有关结果

4.3.1航班文件

4.3.2用户文件

4.3.3管理员文件

4.3.4航班文件

第三章 功能模块结构

2.1功能模块划分思路

2.2用户主要功能模块

2.2.1登录模块

2.2.2注册模块

2.2.3查询界面

2.2.4个人中心界面

2.2.5订票界面

2.2.6改签界面

2.3管理员主要功能模块

2.3.1登录模块

2.3.2注册模块

2.3.3添加航班界面

2.3.4删除航班界面

2.3.5查询航班界面

第四章 主要模块算法

3.1读取与写入算法

3.2查询算法

3.3订票算法

3.5改签算法

3.6添加航班算法

3.7删除航班算法

第五章 课程设计总结

5.1课程设计中的问题

5.1.1文件保存问题

5.1.2全局变量的使用问题

5.1.3管理员界面导航栏的设计问题

5.2课程设计的收获

第六章 源码

6.1 用户操作有关代码

6.1.1用户登录代码

6.1.2用户查询代码

6.1.3用户订票代码

6.1.4个人中心代码(包含退票)

6.1.5用户改签代码

6.1.6用户注册代码

6.2管理员有关代码

6.2.1管理员登录代码

6.2.2管理员注册代码

6.2.3添加航班代码

6.2.4删除航班代码

6.2.5查询航班代码

6.3其他代码

6.3.1航班和乘客定义代码

6.3.2用户定义代码

6.3.3管理员定义代码

6.3.4全局变量

6.3.5主函数


源码下载链接:

https://download.csdn.net/download/Fatunlorey/89232942?spm=1001.2014.3001.5503icon-default.png?t=N7T8https://download.csdn.net/download/Fatunlorey/89232942?spm=1001.2014.3001.5503        这篇文章相当于是一篇课程设计报告,源码参见上面的链接(无需付费)

第一章 航空机票订票系统描述

1.1 具体题目

1.设计每条航线所涉及的信息,包括航班信息:起点终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、票价、余票量等,所有客户订票信息:包括姓名、订票量、航班号,舱位等级1,2或3等;所有客户退票信息:包括姓名、退票量、航班号,舱位等级1,2或3等;

2.结合基本操作的单链表、队列、二叉树等数据结构以及排序算法,设计实现机票订票系统的查询、订票、退票、改签等功能;

3.设计并实现人机交互友好的界面或菜单。

1.2 开发技术栈

    应用技术栈:

    (1)qt版本:Qt6.6.0

    (2)开发语言:C++11

    设计功能技术:

  1. 自定义导航栏开发
  2. QStackWidget、QTableWidget高级控件
  3. QPushButton、QLabel、QLineEdit、QWidget、QComBox、QCheckBox、QToolButton
  4. 自定义布局技术
  5. 自定义信号与槽
  6. 界面的迁移逻辑
  7. 主要文件的保存

1.3 需求分析

                                

                                       

1.4界面迁移逻辑

                                                                          

 第二章 运行结果

4.1用户有关界面

4.1.1用户登陆界面

4.1.2用户查询界面

4.1.3用户订票界面

4.1.4用户改签界面

4.1.5退票界面

4.2管理员有关界面

4.2.1管理员登录界面

4.2.2管理员添加航班界面

4.2.3管理员查询航班界面

4.2.4管理员删除航班界面

4.3文件有关结果

4.3.1航班文件

4.3.2用户文件

4.3.3管理员文件

4.3.4航班文件

第三章 功能模块结构

2.1功能模块划分思路

       根据使用者的不同,可以分为用户使用和管理者使用两类,用户需要实现的功能有登录、注册、订票、退票、改签,查询这六个功能;管理者需要实现的功能有登录、注册、添加、删除,查询航班这五个功能。另外,还有一部分功能,是设计信息的读取与存储,这部分在第三章中会详细描述。

2.2用户主要功能模块

2.2.1登录模块

lineEditAccount:账号的输入;

lineEditPassword:密码的输入;

checkbox:密码隐式或显式输入的选择;

pushButton1:跳转到管理员登录界面;

pushButton2:跳转到用户界面;

pushButton3:跳转到用户注册界面。

2.2.2注册模块

lineEditAccount:账号的输入;

lineEditPassword:密码的输入;

lineEditPassword_2:再次确认密码;

lineEditName:姓名的输入;

lineEditSfz:证件号的输入;

pushButton1:确定创建用户;

pushButton2:取消创建返回登录界面。

2.2.3查询界面

lineEditChu:输入出发地;

lineEditDao:输入到达地;

lineEditDate:输入日期;

tableWidget:显示查询航班信息;

pushButton1:搜素按钮在tableWidget中显示查询的航班信息;

pushButton2:返回按钮,退回到登录界面;

pushButton3:跳转到个人中心界面;

pushButton:在tableWidget中插入的按钮,点击后跳转到订票界面。

2.2.4个人中心界面

labelSet1:显示用户的姓名;

labelSet2:显示用户的账号;

tableWidget:显示用户已经购买的机票信息;

pushButton1:返回按钮,返回查询界面;

pushButton2:退票按钮,点击航班后相应按钮可以实现退票;

pushButton3:改签按钮,点击航班后相应按钮可以跳转到改签界面。

2.2.5订票界面

lineEditName:输入姓名;

lineEditSfz:输入证件号;

comboBox:下拉式窗口选择舱位类型;

graphicsView:设置背景图片;

pushButton1:订票按钮,点击实现订票;

pushButton2:返回按钮,退回查询界面。

2.2.6改签界面

lineEditChu:显示原航班出发地;

lineEditDao:显示原航班到达地;

lineEditDate:选择想要改签的日期;

tableWidget:显示查询航班信息;

pushButton1:搜素按钮在tableWidget中显示查询的航班信息;

pushButton2:返回按钮,退回到个人中心界面;

pushButton:在tableWidget中插入的按钮,点击后进行改签。

2.3管理员主要功能模块

2.3.1登录模块

lineEditAccount:账号的输入;

lineEditPassword:密码的输入;

checkbox:密码隐式或显式输入的选择;

pushButton:跳转到管理员界面;

Buttonregreist:跳转到管理员注册界面;

pushButton_2:返回按钮,返回用户登录界面。

2.3.2注册模块

lineEditAccount:账号的输入;

lineEditPassword:密码的输入;

lineEditPassword_2:再次确认密码;

lineEditName:姓名的输入;

lineEditGongHao:工号的输入;

pushButton1:确定创建管理员;

pushButton2:取消创建返回管理员登录界面。

2.3.3添加航班界面

lineEditArr:输入起始地;

lineEditArrTime:输入起飞时间;

lineEditLau:输入到达地;

lineEditLauTime:输入到达时间;

lineEditCode:输入飞机航班号;

lineEditDate:输入飞机起飞日期;

lineEditNum1:输入飞机经济舱人数;

lineEditNum2:输入超级经济舱人数;

lineEditNum3:输入头等舱人数;

lineEditPrice1:输入飞机经济舱票价;

lineEditPrice2:输入超级经济舱票价;

lineEditPrice3:输入头等舱票价;

pushButton:添加按钮,点击后即可新增航班。

2.3.4删除航班界面

pushButton:删除按钮,点击后即可删除航班。

lineEdit:输入要删除航班的航班号;

2.3.5查询航班界面

lineEditChu:输入出发地;

lineEditDao:输入到达地;

lineEditDate:输入日期;

tableWidget:显示查询航班信息;

pushButton:搜素按钮在tableWidget中显示查询的航班信息;

第四章 主要模块算法

3.1读取与写入算法

        在整个程序使用过程中都需要使用航班、用户和管理员有关信息,所以需要将这些有关变量设置为全局变量,并将读取和写入函数定义为静态函数(即不需要实例化对象就可以使用的全局函数)。程序中航班的信息使用Qlist来存储,而每个航班相应的乘客使用链表的方式存储。

 

        上图中的代码是对flight和customer的定义,以及对读写函数的声明。

        这部分是对航班的读取函数,它的返回类型是Qlist<flight>类型,每次从文件中读取一行数据,用逗号作为标识区分一个航班的不同信息,把每一个航班的信息存入临时flight类型变量info中,然后插入到flightList的尾部,循环一直到读取完所有的航班信息。

        这部分是航班的写入函数,即把flightLsit中的每一个航班信息都写入到文件中,为了防止信息的重复,写入的方式是先清空再写入。

      这部分是乘客信息的写入,即把相应航班的乘客链表循环一遍,然后写入。

        这部分是乘客信息的读取,与航班的读取类似,但是以链表的形式存储。

3.2查询算法

        在用户和管理员的功能中实现了相同的搜索功能,上图中的代码是搜索按钮的槽函数,实现的功能是点击后可以在tableWidget中显示相应符合搜索条件的航班信息。循环遍历flightList中的所有航班信息,与输入的信息进行比较,相同的就将其相应的航班号保存在全局变量数组Array中。循环遍历数组Array,将相应的信息插入到tableWidget中,并在每一行后添加一个名称为“订票”的按钮,它的槽函数是OnBtnClicked()。在管理员界面中的查询功能的实现,没有插入这个按钮。

3.3订票算法

        上面的代码是查询算法插入的按钮的槽函数,通过QModelIndex来获取是表格中的哪一行的订票按钮被点击了,并将modelIdx.row()保存到num0中,把Array数组中相应位置的行数变量赋给全局变量flag,便于在订票界面的cpp文件中使用,最后跳转到订票界面。

        上图中的订票按钮的槽函数,创建一个customer指针类型的变量tmp用来保存新增的用户信息,根据全局变量flag的值就可以确定,用户所选择的航班的信息,要将相应航班的乘客已有的总人数,和用户所选航班类型的航班加1,航班的类型同combox中所选择的文字来确定,type的类型用1,2,3来表示,采用头插法,把tmp插入乘客链表中,最调用保存函数保存。

3.4退票算法

        上图中是个人中心的构造函数,它的实现逻辑和查询算法的实现逻辑相同,但是不同之处在于给tableWidget每一行后插入的按钮不同,槽函数实现的逻辑不同。前一个按钮用作实现删除功能,另一个按钮用来实现改签的功能。

        上图是退票算法的具体实现,与订票相同,需要先获取被点击的位置(即所在tableWidget中的行数),来确定要删除的乘客所在航班在Array数组中的索引。具体的删除算法,与删除链表中某一个节点的做法相似,分别考虑是头节点和非头结点两种情况,若为头节点则先将have指针后移,再将原先的头节点delete;若不是头节点,则需要找到要删除的节点的前一个节点和后一个节点,保存中间要删除的节点,然后将前一个节点的next指针指向后一个节点,delete掉保存的节点。

3.5改签算法

       

上图是改签界面中的搜索按钮的槽函数,它的实现与查询算法相同,仅在插入的按钮的名称处有差异。

       上图是在tableWidget中插入的改签按钮的槽函数,整体思路是先把想要改签的航班进行订票操作,再将原航班进行退票操作,并且获取要改签的票价price2和要删除的乘客的票价price1,再price2减去price1,减去改签费用50,得到res_price,再给出用户提示,完成改签。

3.6添加航班算法

        上图中的代码是添加航班界面的槽函数,第一个循环是为了能够判别用户输入的航班是否存在,若已经存在,则将所有内容清空。然后创建一个flight类型的obj节点,将每一项内容存入obj中后,最后把节点obj添加在flightList的表尾,并调用保存函数,完成添加航班。

3.7删除航班算法

        上图是删除航班界面中删除按钮的槽函数,只需要依据管理员提供的航班号,通过循环匹配后调用Qlist的removeAt函数,删除节点即可,最后保存。

第五章 课程设计总结

5.1课程设计中的问题

5.1.1文件保存问题

        首先是qt的文件操作函数与C++的文件操作函数存在差异,在qt中需要使用QFile类和QTextStream类,且文件名称"C:\Users\86183\Desktop\语言学习\C++\航空订票系统\flight.txt"这样是会出现报错的,需要写成"C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\flight.txt"才能通过编译。

       为了实现文件的正常读取,在保存的时候航班和乘客信息都是一行一行保存,在每一行的不同信息之间,使用英文的逗号隔开。刚开始是考虑在每一步去使用读取函数,但是这可能出现对文件的写入出现重复的情况,因此只在main.cpp文件中使用一次航班和乘客的读取函数,后面只进行保存的操作,每一个操作都必须有保存,避免数据的丢失。

5.1.2全局变量的使用问题

        首先为了能在非flight.cpp文件以外的部分使用航班和乘客的读取和保存函数,需要将QList<flight> readFlight()和bool saveFlight(const QList<flight>& flightList)函数前加上static关键字,这样在没有实例flight类型变量的情况下,也可以直接调用函数。

       另外,为了使读取的航班信息在每一文件中都可以使用,在global.h中定义QList型的flightList,同理也定义了userList以确保在每一文件中都可以使用用户的信息。在使用tableWidget在表中插入了按钮,为了获取按钮在行航班在flightList中的索引,又定义了Array数组,和flag,flag_gai两个int型变量,Array数组是为了记录在某一约束条件下,满足条件的航班的索引,flag和flag_gai用来记录,订票、删除,改签时的按钮所在航班的索引。

5.1.3管理员界面导航栏的设计问题

        为了使界面变得简洁美观,需要设计就一个可以在左侧点击,就可以使右边切换界面的导航栏,通过网上查阅资料,发现使用stackedWidget高级控件可以实现这样的功能,另外为了使导航栏的几个选项可以填满左边那一部分界面,又使用了verticalSpacer控件。

       在实现静态界面后,还需要使得选项中的几个界面成为它的子界面,又使用了stackedWidget的addWidget()和setCurrentIndex()函数,实现界面的插入和切换,成功解决了导航栏的设计问题。

5.2课程设计的收获

        首先,当然是编程能力和解决问题的能力得到了一定的提高,从一个qt小白,到已经能掌握qt一些基本的操作。刚开始,其实有一些畏难情绪,考虑到也没有学过qt,打算只有c++写一个dos界面的程序,但是在开始尝试着做的时候,许多问题也都迎刃而解,这让我意识到编程就是一个在未知中摸索的过程,从刚开始,做一个登录界面就做了一天,到最后写一个界面可能只需要一个小时,我在这个过程中,也感受到了自身的进步。另外一个体会就是最能提升编程能力的方法,就是写一些这样的大作业或是项目,正所谓纸上得来终觉浅,绝知此事要躬行。

第六章 源码

6.1 用户操作有关代码

6.1.1用户登录代码

#ifndef CELL_MAIN_H

#define CELL_MAIN_H

#include <QMainWindow>

#include <QProcess>

#include <QString>

QT_BEGIN_NAMESPACE

namespace Ui { class Cell_Main; }

QT_END_NAMESPACE


class Cell_Main : public QMainWindow

{

    Q_OBJECT

public:

    Cell_Main(QWidget *parent = nullptr);

    ~Cell_Main();

private slots:

void on_checkBox_toggled(bool checked);

void on_PushBotton_clicked();

    void on_Buttonregerist_clicked();

    void on_pushButton_clicked();

private:

    Ui::Cell_Main *ui;

};

#endif // CELL_MAIN_H


 

#include "cell_main.h"

#include "ui_cell_main.h"

#include "global.h"

#include "denglu.h"

#include "maneger.h"

#include "zhuce.h"

#include "user.h"

#include <QFile>

#include <QDebug>

#include <QTextStream>

#include <QMessageBox>


Cell_Main::Cell_Main(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::Cell_Main)

{

    this->setWindowTitle("用户登录界面");

    ui->setupUi(this);

    ui->lineEditAccount->setPlaceholderText("请输入手机号");

    ui->lineEditPassword->setPlaceholderText("请输入密码");

}

Cell_Main::~Cell_Main()

{

    delete ui;

}

//是否显示密码

void Cell_Main::on_checkBox_toggled(bool checked)

{

    if(checked)

    {

        ui->lineEditPassword->setEchoMode(QLineEdit::Normal);

    }

    else

    {

        ui->lineEditPassword->setEchoMode(QLineEdit::Password);

    }

}


//登录界面的确认按钮

void Cell_Main::on_PushBotton_clicked()

{

    int cnt=userList.size();

    //判断账号是否存在,若存在,则判断密码是否正确;否则,该用户不存在

    bool accountFound = false;

    for(int i=0; i<cnt; i++)

    {

        if(userList[i].phone == ui->lineEditAccount->text())

        {

            accountFound = true;

            if(userList[i].password == ui->lineEditPassword->text())

            {

                num=i;

                qDebug()<<num;

                denglu * denglu1 = new denglu(this);

                denglu1->show();

                ui->lineEditAccount->setPlaceholderText("请输入手机号");

                ui->lineEditPassword->setPlaceholderText("请输入密码");

                //this->hide();

                ui->lineEditAccount->clear();

                ui->lineEditPassword->clear();

                QMessageBox::information(this, "提示", "登录成功");

                break; // 找到匹配账号和密码后跳出循环

            }

            else

            {

                ui->lineEditPassword->clear();

                ui->lineEditPassword->setPlaceholderText("密码错误,请重新输入");

                break; // 找到匹配账号但密码错误后跳出循环

            }

        }

    }


    if(!accountFound)

    {

        ui->lineEditAccount->clear();

        ui->lineEditPassword->clear();

        ui->lineEditAccount->setPlaceholderText("该用户不存在");

    }

}


//关联注册界面

void Cell_Main::on_Buttonregerist_clicked()

{

    zhuce * zhuce1 = new zhuce(this);

    zhuce1->show();

    ui->lineEditAccount->clear();

    ui->lineEditPassword->clear();

}


//关联管理员界面

void Cell_Main::on_pushButton_clicked()

{

    maneger *maneger1=new maneger(this);

    maneger1->show();

}

6.1.2用户查询代码

#ifndef DENGLU_H

#define DENGLU_H

#include <QWidget>

#include <QPushButton>

namespace Ui {

class denglu;

}

class denglu : public QWidget

{

    Q_OBJECT

public:

    explicit denglu(QWidget *parent = nullptr);

    ~denglu();

private slots:

    void on_pushButton_2_clicked();

    void OnBtnClicked();

    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

private:

    Ui::denglu *ui;

};

#endif // DENGLU_H
#include "denglu.h"

#include "ui_denglu.h"

#include "global.h"

#include "customor_dingpao.h"

#include "gerenzx.h"

#include <QTableWidget>

#include <QTableWidgetItem>

#include <qstackedwidget.h>

#include <QMessageBox>


denglu::denglu(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::denglu)

{

    ui->setupUi(this);

    ui->lineEditChu->setPlaceholderText("出发地");

    ui->lineEditDao->setPlaceholderText("到达地");

    ui->lineEditDate->setPlaceholderText("10-23");

}



denglu::~denglu()

{

    delete ui;

}


//返回登录

void denglu::on_pushButton_2_clicked()

{

    //调用parentWidget()返回上一界面的this指针,并显示

    this->hide();

    this->parentWidget()->show();

}


void denglu::on_pushButton_clicked()

{

    //清空tablewidget

    int counter = ui->tableWidget->rowCount();

    qDebug()<< "counter is" << counter;

    while (counter)

    {

        ui->tableWidget->removeRow(0);

        counter--;

    }

    for(int i=0;i<20;i++)

        Array[i]=0;

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    int cnt_result=0;


    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditChu->text()!=""&&ui->lineEditDao->text()!=""&&ui->lineEditDate->text()!="")

        {

            if(ui->lineEditChu->text()==flightList[i].qd

                &&ui->lineEditDao->text()==flightList[i].zd

                &&ui->lineEditDate->text()==flightList[i].data)

            {

                Array[cnt_result++]=i;

            }

        }

        else

        {

            ui->lineEditChu->clear();

            ui->lineEditDao->clear();

            ui->lineEditDate->clear();

            ui->lineEditChu->setPlaceholderText("不能为空");

        }

    }

    qDebug()<<cnt_result;

    if(cnt_result==0)

    {

        ui->lineEditChu->clear();

        ui->lineEditDao->clear();

        ui->lineEditDate->clear();

        QMessageBox::information(this, "提示", "当日无此航班");


    }

    for(int i=0;i<cnt_result;i++)

    {

        int row = ui->tableWidget->rowCount(); // Get the current row count

        ui->tableWidget->insertRow(row); // Insert a new row at the end

        //ui->tableWidget->setItem(row, 0, new QTableWidgetItem("Your data"))

        ui->tableWidget->setItem(row, 0, new QTableWidgetItem(flightList[Array[i]].num));

        ui->tableWidget->setItem(row, 1, new QTableWidgetItem(flightList[Array[i]].time));

        QString str = QString::number(flightList[Array[i]].jg[0]);

        ui->tableWidget->setItem(row, 2, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].jg[1]);

        ui->tableWidget->setItem(row, 3, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].jg[2]);

        ui->tableWidget->setItem(row, 4, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[0]);

        ui->tableWidget->setItem(row, 5, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[1]);

        ui->tableWidget->setItem(row, 6, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[2]);

        ui->tableWidget->setItem(row, 7, new QTableWidgetItem(str));

for(int j=0;j<8;j++)

        {

            ui->tableWidget->item(row, j)->setTextAlignment(Qt::AlignCenter);

        }

        QPushButton *pBtn = new QPushButton();

        // 绑定信号

        connect(pBtn, SIGNAL(clicked()), this, SLOT(OnBtnClicked()));

        // 在QTableWidget中添加控件

        pBtn->setText("订票");

        ui->tableWidget->setCellWidget(row,8,pBtn);

        // 绑定的响应函数

    }

}


void denglu::OnBtnClicked()

{

    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

    QModelIndex modeIdx = ui->tableWidget->indexAt(QPoint(clickedButton->frameGeometry().x(),clickedButton->frameGeometry().y()));

    qDebug()<<"按钮所在单元格:"<<modeIdx.row()<<":"<<modeIdx.column();


    int num0=modeIdx.row();

    flag=Array[num0];

    qDebug()<<flag;

Customor_DingPao *obj1=new Customor_DingPao(this);

    obj1->show();

}


void denglu::on_pushButton_3_clicked()

{

    GeRenZX *obj1=new GeRenZX(this);

    obj1->show();

}

6.1.3用户订票代码

#ifndef CUSTOMOR_DINGPAO_H

#define CUSTOMOR_DINGPAO_H


#include <QWidget>


namespace Ui {

class Customor_DingPao;

}


class Customor_DingPao : public QWidget

{

    Q_OBJECT

public:

    explicit Customor_DingPao(QWidget *parent = nullptr);

    ~Customor_DingPao();

private slots:

    void on_pushButtonBack_clicked();

    void on_pushButton_clicked();

private:

    Ui::Customor_DingPao *ui;

};


#endif // CUSTOMOR_DINGPAO_H

#include "customor_dingpao.h"

#include "ui_customor_dingpao.h"

#include "global.h"

#include "flight.h"

#include <QMessageBox>


Customor_DingPao::Customor_DingPao(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Customor_DingPao)

{

    ui->setupUi(this);

    //设置文本内容

    ui->lineEditCode->setText(flightList[flag].num);

    ui->lineEditDate->setText(flightList[flag].data);

    ui->lineEditLau->setText(flightList[flag].qd);

    ui->lineEditArr->setText(flightList[flag].zd);


    QString str =flightList[flag].time;

    QStringList stringList = str.split("-");

    ui->lineEditLauTime->setText(stringList[0]);

    ui->lineEditArrTime->setText(stringList[1]);

    QString num1 = QString::number(flightList[flag].jg[0]);

    QString num2 = QString::number(flightList[flag].jg[1]);

    QString num3 = QString::number(flightList[flag].jg[2]);

    ui->lineEditPrice1->setText(num1);

    ui->lineEditPrice2->setText(num2);

    ui->lineEditPrice3->setText(num3);

    ui->lineEditName->setPlaceholderText("输入姓名");

    ui->lineEditSfz->setPlaceholderText("输入证件号");


    //QString currentText = ui->comboBox->currentText();

    //qDebug() << "当前选中的内容:" << currentText;

}


Customor_DingPao::~Customor_DingPao()

{

    delete ui;

}


void Customor_DingPao::on_pushButtonBack_clicked()

{

    //调用parentWidget()返回上一界面的this指针,并显示

    this->hide();

    this->parentWidget()->show();

}


void Customor_DingPao::on_pushButton_clicked()

{

    int res_price;

    //flightList[flag].read_customer(flightList[flag]);

    int number=flightList[flag].is_have;

    int num1=flightList[flag].is_jg1;

    int num2=flightList[flag].is_jg2;

    int num3=flightList[flag].is_jg3;

    int cnt1=flightList[flag].rs[0];

    int cnt2=flightList[flag].rs[1];

    int cnt3=flightList[flag].rs[2];

    if(number>=(cnt1+cnt2+cnt3))

    {

        QMessageBox::information(this, "提示", "该航班无余票");

        ui->lineEditName->clear();

        ui->lineEditSfz->clear();

        ui->lineEditName->setPlaceholderText("输入姓名");

        ui->lineEditSfz->setPlaceholderText("输入证件号");

        return;

    }


    customer* tmp=new customer;

    tmp->name=ui->lineEditName->text().toUtf8();

    tmp->sfz=ui->lineEditSfz->text().toUtf8();


    QString currentText = ui->comboBox->currentText();

    if(currentText=="经济舱")

    {

        tmp->type=1;

        res_price=flightList[flag].jg[0];

        flightList[flag].is_jg1++;

        if(num1>=flightList[flag].rs[0])

        {

            QMessageBox::information(this, "提示", "经济舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    if(currentText=="超级经济舱")

    {

        tmp->type=2;

        res_price=flightList[flag].jg[1];

        flightList[flag].is_jg2++;

        if(num2>=flightList[flag].rs[1])

        {

            QMessageBox::information(this, "提示", "超级经济舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    if(currentText=="头等舱")

    {

        tmp->type=3;

        res_price=flightList[flag].jg[2];

        flightList[flag].is_jg3++;

        if(num3>=flightList[flag].rs[2])

        {

            QMessageBox::information(this, "提示", "头等舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    flightList[flag].is_have++;

    tmp->next=flightList[flag].have; // 将新的customer对象连接到链表中

    flightList[flag].have = tmp;

    flightList[flag].save_customer(flightList[flag]);

    bool result=flight::saveFlight(flightList);

    if(result)

    {

        QString mess=QString::number(res_price);

        QMessageBox::information(this, "提示", "订票成功,您需支付"+mess+"元");

    }

    else

    {

        QMessageBox::information(this, "提示", "订票失败");

    }

    ui->lineEditName->clear();

    ui->lineEditSfz->clear();

    ui->lineEditName->setPlaceholderText("输入姓名");

    ui->lineEditSfz->setPlaceholderText("输入证件号");

}

6.1.4个人中心代码(包含退票)

#include "customor_dingpao.h"

#include "ui_customor_dingpao.h"

#include "global.h"

#include "flight.h"

#include <QMessageBox>


Customor_DingPao::Customor_DingPao(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Customor_DingPao)

{

    ui->setupUi(this);

    //设置文本内容

    ui->lineEditCode->setText(flightList[flag].num);

    ui->lineEditDate->setText(flightList[flag].data);

    ui->lineEditLau->setText(flightList[flag].qd);

    ui->lineEditArr->setText(flightList[flag].zd);


    QString str =flightList[flag].time;

    QStringList stringList = str.split("-");

    ui->lineEditLauTime->setText(stringList[0]);

    ui->lineEditArrTime->setText(stringList[1]);

    QString num1 = QString::number(flightList[flag].jg[0]);

    QString num2 = QString::number(flightList[flag].jg[1]);

    QString num3 = QString::number(flightList[flag].jg[2]);

    ui->lineEditPrice1->setText(num1);

    ui->lineEditPrice2->setText(num2);

    ui->lineEditPrice3->setText(num3);

    ui->lineEditName->setPlaceholderText("输入姓名");

    ui->lineEditSfz->setPlaceholderText("输入证件号");


    //QString currentText = ui->comboBox->currentText();

    //qDebug() << "当前选中的内容:" << currentText;

}


Customor_DingPao::~Customor_DingPao()

{

    delete ui;

}


void Customor_DingPao::on_pushButtonBack_clicked()

{

    //调用parentWidget()返回上一界面的this指针,并显示

    this->hide();

    this->parentWidget()->show();

}


void Customor_DingPao::on_pushButton_clicked()

{

    int res_price;

    //flightList[flag].read_customer(flightList[flag]);

    int number=flightList[flag].is_have;

    int num1=flightList[flag].is_jg1;

    int num2=flightList[flag].is_jg2;

    int num3=flightList[flag].is_jg3;

    int cnt1=flightList[flag].rs[0];

    int cnt2=flightList[flag].rs[1];

    int cnt3=flightList[flag].rs[2];

    if(number>=(cnt1+cnt2+cnt3))

    {

        QMessageBox::information(this, "提示", "该航班无余票");

        ui->lineEditName->clear();

        ui->lineEditSfz->clear();

        ui->lineEditName->setPlaceholderText("输入姓名");

        ui->lineEditSfz->setPlaceholderText("输入证件号");

        return;

    }


    customer* tmp=new customer;

    tmp->name=ui->lineEditName->text().toUtf8();

    tmp->sfz=ui->lineEditSfz->text().toUtf8();


    QString currentText = ui->comboBox->currentText();

    if(currentText=="经济舱")

    {

        tmp->type=1;

        res_price=flightList[flag].jg[0];

        flightList[flag].is_jg1++;

        if(num1>=flightList[flag].rs[0])

        {

            QMessageBox::information(this, "提示", "经济舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    if(currentText=="超级经济舱")

    {

        tmp->type=2;

        res_price=flightList[flag].jg[1];

        flightList[flag].is_jg2++;

        if(num2>=flightList[flag].rs[1])

        {

            QMessageBox::information(this, "提示", "超级经济舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    if(currentText=="头等舱")

    {

        tmp->type=3;

        res_price=flightList[flag].jg[2];

        flightList[flag].is_jg3++;

        if(num3>=flightList[flag].rs[2])

        {

            QMessageBox::information(this, "提示", "头等舱无余票");

            ui->lineEditName->clear();

            ui->lineEditSfz->clear();

            ui->lineEditName->setPlaceholderText("输入姓名");

            ui->lineEditSfz->setPlaceholderText("输入证件号");

            return;

        }

    }

    flightList[flag].is_have++;

    tmp->next=flightList[flag].have; // 将新的customer对象连接到链表中

    flightList[flag].have = tmp;

    flightList[flag].save_customer(flightList[flag]);

    bool result=flight::saveFlight(flightList);

    if(result)

    {

        QString mess=QString::number(res_price);

        QMessageBox::information(this, "提示", "订票成功,您需支付"+mess+"元");

    }

    else

    {

        QMessageBox::information(this, "提示", "订票失败");

    }

    ui->lineEditName->clear();

    ui->lineEditSfz->clear();

    ui->lineEditName->setPlaceholderText("输入姓名");

    ui->lineEditSfz->setPlaceholderText("输入证件号");

}
#include "gerenzx.h"

#include "ui_gerenzx.h"

#include "customer_gaiqian.h"

#include "global.h"

#include "user.h"

#include <QTableWidget>

#include <QString>

#include <QTableWidgetItem>

#include <qstackedwidget.h>

#include <QMessageBox>


GeRenZX::GeRenZX(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::GeRenZX)

{

    ui->setupUi(this);

    ui->labelSet1->setText(userList[num].name);

    ui->labelSet2->setText(userList[num].phone);


    //清空tablewidget

    int counter = ui->tableWidget->rowCount();

    qDebug()<< "counter is" << counter;

    while (counter)

    {

        ui->tableWidget->removeRow(0);

        counter--;

    }


    for(int i=0;i<20;i++)

        Array[i]=0;

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    int cnt_result=0;


    for(int i=0;i<cnt;i++)

    {

        //flightList[i].read_customer(flightList[i]);

        customer*tmp=flightList[i].have;

        while (tmp)

        {

            if(userList[num].name==tmp->name)

            {

                Record[cnt_result]=tmp->type;

                Array[cnt_result++]=i;

            }

            tmp=tmp->next;

        }

    }

    qDebug()<<"机票数"<<cnt_result;

    for(int i=0;i<cnt_result;i++)

    {

        int row = ui->tableWidget->rowCount(); // Get the current row count

        ui->tableWidget->insertRow(row); // Insert a new row at the end

        //ui->tableWidget->setItem(row, 0, new QTableWidgetItem("Your data"))

        ui->tableWidget->setItem(row, 0, new QTableWidgetItem(flightList[Array[i]].num));

        ui->tableWidget->setItem(row, 1, new QTableWidgetItem(flightList[Array[i]].qd));

        ui->tableWidget->setItem(row, 2, new QTableWidgetItem(flightList[Array[i]].zd));

        ui->tableWidget->setItem(row, 3, new QTableWidgetItem(flightList[Array[i]].data));

        ui->tableWidget->setItem(row, 4, new QTableWidgetItem(flightList[Array[i]].time));

        QString str;

        int price;

        if(Record[i]==1)

        {

            price=flightList[Array[i]].jg[0];

            str="经济舱";

        }

        if(Record[i]==2)

        {

            price=flightList[Array[i]].jg[1];

            str="超级经济舱";

        }

        if(Record[i]==3)

        {

            price=flightList[Array[i]].jg[2];

            str="头等舱";

        }

        ui->tableWidget->setItem(row, 5, new QTableWidgetItem(str));

        ui->tableWidget->setItem(row, 6, new QTableWidgetItem(QString::number(price)));

        for(int j=0;j<7;j++)

        {

            ui->tableWidget->item(row, j)->setTextAlignment(Qt::AlignCenter);

        }

        QPushButton *pBtn = new QPushButton();

        QPushButton *pBtn0 = new QPushButton();

        // 绑定信号

        connect(pBtn, SIGNAL(clicked()), this, SLOT(OnBtnClicked()));

        connect(pBtn0, SIGNAL(clicked()), this, SLOT(OnBtnClicked0()));


        // 在QTableWidget中添加控件

        pBtn->setText("退票");

        ui->tableWidget->setCellWidget(row,7,pBtn);


        pBtn0->setText("改签");

        ui->tableWidget->setCellWidget(row,8,pBtn0);

        // 绑定的响应函数

}


}


GeRenZX::~GeRenZX()

{

    delete ui;

}


void GeRenZX::on_pushButton_2_clicked()

{

    this->hide();

    this->parentWidget()->show();

}


void GeRenZX::OnBtnClicked()

{

    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

    QModelIndex modeIdx = ui->tableWidget->indexAt(QPoint(clickedButton->frameGeometry().x(),clickedButton->frameGeometry().y()));

    qDebug()<<"按钮所在单元格:"<<modeIdx.row()<<":"<<modeIdx.column();

    int num0=modeIdx.row();

    int cus=Array[num0];

    //获取要被删乘客所在航班位置

    qDebug()<<cus;

    //删除一个航班乘客的节点

    while (flightList[cus].have != NULL && flightList[cus].have->name == userList[num].name) { // 注意这里不是if

        customer* tmp = flightList[cus].have;

        flightList[cus].have = flightList[cus].have->next;

        flightList[cus].is_have--;

        if(tmp->type==1)

            flightList[cus].is_jg1--;

        if(tmp->type==2)

            flightList[cus].is_jg2--;

        if(tmp->type==3)

            flightList[cus].is_jg3--;

        delete tmp;

    }

    customer* cur = flightList[cus].have;

    while (cur != NULL && cur->next!= NULL) {

        if (cur->next->name == userList[num].name) {

            customer* tmp = cur->next;

            cur->next = cur->next->next;


            flightList[cus].is_have--;

            if(tmp->type==1)

                flightList[cus].is_jg1--;

            if(tmp->type==2)

                flightList[cus].is_jg2--;

            if(tmp->type==3)

                flightList[cus].is_jg3--;

            delete tmp;

        }

        else {

            cur = cur->next;

        }

    }

    flightList[cus].save_customer(flightList[cus]);

    bool judge=flight::saveFlight(flightList);

    if(judge==0)

    {

        QMessageBox::information(this, "提示", "退票失败");

    }

    if(judge==1)

    {

        QMessageBox::information(this, "提示", "退票成功,退款将在3个工作日内到账");

        ui->tableWidget->removeRow(num0);

    }

}


//改签需要一个独立界面设置

void GeRenZX::OnBtnClicked0()

{

    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

    QModelIndex modeIdx = ui->tableWidget->indexAt(QPoint(clickedButton->frameGeometry().x(),clickedButton->frameGeometry().y()));

    qDebug()<<"按钮所在单元格:"<<modeIdx.row()<<":"<<modeIdx.column();


    int num0=modeIdx.row();

    //获取要改签航班在flightlist当中的位置,并保存

    flag_gai=Array[num0];

    qDebug()<<flag_gai;

customer_GaiQian *obj1=new customer_GaiQian(this);

    obj1->show();

}

6.1.5用户改签代码

#ifndef CUSTOMER_GAIQIAN_H

#define CUSTOMER_GAIQIAN_H


#include <QWidget>

namespace Ui {

class customer_GaiQian;

}

class customer_GaiQian : public QWidget

{

    Q_OBJECT

public:

    explicit customer_GaiQian(QWidget *parent = nullptr);

    ~customer_GaiQian();

private slots:

    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

    void OnBtnClicked();

private:

    Ui::customer_GaiQian *ui;

};


#endif // CUSTOMER_GAIQIAN_H
#include "customer_gaiqian.h"

#include "ui_customer_gaiqian.h"

#include "global.h"

#include "user.h"

#include <QTableWidget>

#include <QString>

#include <QTableWidgetItem>

#include <qstackedwidget.h>

#include <QMessageBox>

#include <QtGlobal>


customer_GaiQian::customer_GaiQian(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::customer_GaiQian)

{

    ui->setupUi(this);

    ui->lineEditChu->setPlaceholderText("出发地");

    ui->lineEditDao->setPlaceholderText("到达地");

    ui->lineEditDate->setPlaceholderText("10-23");

    ui->lineEditChu->setText(flightList[flag_gai].qd);

    ui->lineEditDao->setText(flightList[flag_gai].zd);

    ui->lineEditDate->setText(flightList[flag_gai].data);

}


customer_GaiQian::~customer_GaiQian()

{

    delete ui;

}


void customer_GaiQian::on_pushButton_2_clicked()

{

    this->hide();

    this->parentWidget()->show();

}


void customer_GaiQian::on_pushButton_clicked()

{

    //清空tablewidget

    int counter = ui->tableWidget->rowCount();

    qDebug()<< "counter is" << counter;

    while (counter)

    {

        ui->tableWidget->removeRow(0);

        counter--;

    }


    for(int i=0;i<20;i++)

        Array[i]=0;

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    int cnt_result=0;


    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditChu->text()!=""&&ui->lineEditDao->text()!=""&&ui->lineEditDate->text()!="")

        {

            if(ui->lineEditChu->text()==flightList[i].qd

                &&ui->lineEditDao->text()==flightList[i].zd

                &&ui->lineEditDate->text()==flightList[i].data)

            {

                Array[cnt_result++]=i;

            }

        }

        else

        {

            ui->lineEditChu->clear();

            ui->lineEditDao->clear();

            ui->lineEditDate->clear();

            ui->lineEditChu->setPlaceholderText("不能为空");

        }

    }

    qDebug()<<cnt_result;

    if(cnt_result==0)

    {

        ui->lineEditChu->clear();

        ui->lineEditDao->clear();

        ui->lineEditDate->clear();

        QMessageBox::information(this, "提示", "当日无此航班");


    }

    for(int i=0;i<cnt_result;i++)

    {

        int row = ui->tableWidget->rowCount(); // Get the current row count

        ui->tableWidget->insertRow(row); // Insert a new row at the end

        ui->tableWidget->setItem(row, 0, new QTableWidgetItem(flightList[Array[i]].num));

        ui->tableWidget->setItem(row, 1, new QTableWidgetItem(flightList[Array[i]].time));

        QString str = QString::number(flightList[Array[i]].jg[0]);

        ui->tableWidget->setItem(row, 2, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].jg[1]);

        ui->tableWidget->setItem(row, 3, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].jg[2]);

        ui->tableWidget->setItem(row, 4, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[0]);

        ui->tableWidget->setItem(row, 5, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[1]);

        ui->tableWidget->setItem(row, 6, new QTableWidgetItem(str));

        str = QString::number(flightList[Array[i]].rs[2]);

        ui->tableWidget->setItem(row, 7, new QTableWidgetItem(str));


        for(int j=0;j<8;j++)

        {

            ui->tableWidget->item(row, j)->setTextAlignment(Qt::AlignCenter);

        }


        QPushButton *pBtn = new QPushButton();

        // 绑定信号

        connect(pBtn, SIGNAL(clicked()), this, SLOT(OnBtnClicked()));


        // 在QTableWidget中添加控件

        pBtn->setText("改签");

        ui->tableWidget->setCellWidget(row,8,pBtn);

        // 绑定的响应函数

    }

}

void customer_GaiQian::OnBtnClicked()

{

    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

    QModelIndex modeIdx = ui->tableWidget->indexAt(QPoint(clickedButton->frameGeometry().x(),clickedButton->frameGeometry().y()));

    qDebug()<<"按钮所在单元格:"<<modeIdx.row()<<":"<<modeIdx.column();


    int num0=modeIdx.row();

    flag=Array[num0];

    qDebug()<<flag;


    //先订票

    int res_price;

    int number=flightList[flag].is_have;

    int num1=flightList[flag].is_jg1;

    int num2=flightList[flag].is_jg2;

    int num3=flightList[flag].is_jg3;

    int cnt1=flightList[flag].rs[0];

    int cnt2=flightList[flag].rs[1];

    int cnt3=flightList[flag].rs[2];

    if(number>=(cnt1+cnt2+cnt3))

    {

        QMessageBox::information(this, "提示", "该航班无余票");

        return;

    }


    customer* tmp=new customer;

    tmp->name=userList[num].name;

    tmp->sfz=userList[num].sfz;

    customer*cur=flightList[flag_gai].have;

    while(cur)

    {

        if(cur->name==userList[num].name)

        {

            tmp->type=cur->type;

            break;

        }

        else

        {

            cur=cur->next;

        }

    }


    int price1=flightList[flag_gai].jg[tmp->type-1];

    int price2=flightList[flag].jg[tmp->type-1];

    res_price=price2-price1;


    if(tmp->type==1)

    {

        flightList[flag].is_jg1++;

        if(num1>=flightList[flag].rs[0])

        {

            QMessageBox::information(this, "提示", "经济舱无余票");

            return;

        }

}


    if(tmp->type==2)

    {

        flightList[flag].is_jg2++;

        if(num2>=flightList[flag].rs[1])

        {

            QMessageBox::information(this, "提示", "超级经济舱无余票");

            return;

        }

    }

    if(tmp->type==3)

    {

        flightList[flag].is_jg3++;

        if(num3>=flightList[flag].rs[2])

        {

            QMessageBox::information(this, "提示", "头等舱无余票");

            return;

        }

    }


    flightList[flag].is_have++;

    tmp->next=flightList[flag].have; // 将新的customer对象连接到链表中

    flightList[flag].have = tmp;


    //再删除

    //删除一个航班乘客的节点

    while (flightList[flag_gai].have != NULL && flightList[flag_gai].have->name == userList[num].name) { // 注意这里不是if

        customer* tmp0 = flightList[flag_gai].have;

        flightList[flag_gai].have = flightList[flag_gai].have->next;


        flightList[flag_gai].is_have--;

        if(tmp0->type==1)

            flightList[flag_gai].is_jg1--;

        if(tmp0->type==2)

            flightList[flag_gai].is_jg2--;

        if(tmp0->type==3)

            flightList[flag_gai].is_jg3--;

        delete tmp0;

    }

    cur = flightList[flag_gai].have;

    while (cur != NULL && cur->next!= NULL) {

        if (cur->next->name == userList[num].name) {

            customer* tmp0 = cur->next;

            cur->next = cur->next->next;


            flightList[flag_gai].is_have--;

            if(tmp0->type==1)

                flightList[flag_gai].is_jg1--;

            if(tmp0->type==2)

                flightList[flag_gai].is_jg2--;

            if(tmp0->type==3)

                flightList[flag_gai].is_jg3--;

            delete tmp0;

        }

        else {

            cur = cur->next;

        }

    }

    flightList[flag_gai].save_customer(flightList[flag_gai]);

    flightList[flag].save_customer(flightList[flag]);

    bool result=flight::saveFlight(flightList);

    QString mess;

    if(result)

    {

        res_price-=50;

        if(res_price>=0)

        {

            //res_price+=50;

            mess=QString::number(res_price);

            QMessageBox::information(this, "提示", "改签成功,为您退还"+mess+"元");

        }

        else

        {

            //res_price-=50;

            res_price=qAbs(res_price);

            mess=QString::number(res_price);

            QMessageBox::information(this, "提示", "改签成功,您需支付"+mess+"元");

        }

    }

    else

    {

        QMessageBox::information(this, "提示", "改签失败");

    }

}

6.1.6用户注册代码

#ifndef ZHUCE_H

#define ZHUCE_H


#include <QWidget>


namespace Ui {

class zhuce;

}


class zhuce : public QWidget

{

    Q_OBJECT

public:

    explicit zhuce(QWidget *parent = nullptr);

    ~zhuce();

private slots:

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:

    Ui::zhuce *ui;

};

#endif // ZHUCE_H
#include "zhuce.h"

#include "user.h"

#include "ui_zhuce.h"

#include <QFile>

#include <QDebug>

#include <QString>

#include <QMessageBox>


zhuce::zhuce(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::zhuce)

{

    ui->setupUi(this);

    ui->lineEditAccount->setPlaceholderText("请输入手机号");

    ui->lineEditPassword->setPlaceholderText("请输入密码");

    ui->lineEditPassword_2->setPlaceholderText("请再次输入密码");

    ui->lineEditPassword_4->setPlaceholderText("请输入证件号");

    ui->lineEditPassword_3->setPlaceholderText("请输入姓名");

}


zhuce::~zhuce()

{

    delete ui;

}


//注册的确认按钮

void zhuce::on_pushButton_clicked()

{

    //读取已有账户信息,确认是否已经有此账号

    //qDebug()<<("文件打开失败");

    int cnt=0;

    if (!userList.isEmpty()) {

        cnt = userList.size();

    }


    //判断账号是否存在

    bool accountFound = false;

    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditAccount->text()==userList[i].phone)

        {

            ui->lineEditAccount->clear();

            ui->lineEditPassword->clear();

            ui->lineEditPassword_2->clear();

            ui->lineEditAccount->setPlaceholderText("该用户已存在");

            accountFound=true;

            break;

        }

    }


    if(!accountFound)

    {

        if(!ui->lineEditPassword->text().isEmpty() && !ui->lineEditPassword_2->text().isEmpty())

        {

            if(ui->lineEditPassword->text()==ui->lineEditPassword_2->text())

            {

                user obj;

                obj.name=ui->lineEditPassword_3->text().toUtf8();

                obj.password=ui->lineEditPassword->text().toUtf8();

                obj.phone=ui->lineEditAccount->text().toUtf8();

                obj.sfz=ui->lineEditPassword_4->text().toUtf8();

                userList.append(obj);


                bool result=user::saveUser(userList);

                if(result)

                {

                    QMessageBox::information(this, "提示", "注册成功");

                    ui->lineEditAccount->clear();

                    ui->lineEditPassword->clear();

                    ui->lineEditPassword_2->clear();

                    ui->lineEditPassword_3->clear();

                    ui->lineEditPassword_4->clear();

                    this->hide();

                    this->parentWidget()->show();

                }

                else

                {

                    QMessageBox::information(this, "提示", "注册失败");

                }

            }

            else

            {

                ui->lineEditPassword_2->clear();

                ui->lineEditPassword_2->setPlaceholderText("请重新输入密码");

            }

        }

        else

        {

            ui->lineEditPassword->clear();

            ui->lineEditPassword_2->clear();

            ui->lineEditPassword->setPlaceholderText("密码不能为空");

        }

    }

}

//返回登录界面

void zhuce::on_pushButton_2_clicked()

{

    this->hide();

    this->parentWidget()->show();

}

6.2管理员有关代码

6.2.1管理员登录代码

#ifndef DENGLU_GOVERN_H

#define DENGLU_GOVERN_H


#include <QMainWindow>

#include <QWidget>

#include "flight_sereach.h"

#include "flight_add.h"

#include "flight_delete.h"


namespace Ui {

class denglu_govern;

}


class denglu_govern : public QWidget

{

    Q_OBJECT

public:

    explicit denglu_govern(QWidget *parent = nullptr);

    ~denglu_govern();

    void initPage();

    void dealMenu();

private slots:

    void on_btnSereach_clicked();

private:

    Ui::denglu_govern *ui;

    Flight_sereach *m_sereach;

    flight_add *m_add;

    flight_delete *m_delete;

};

#endif // DENGLU_GOVERN_H
#include "denglu_govern.h"

#include "maneger.h"

#include "ui_denglu_govern.h"

#include <QPushButton>

#include <qDebug>

denglu_govern::denglu_govern(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::denglu_govern),

    m_sereach(nullptr),

    m_add(nullptr),

    m_delete(nullptr)

{

    ui->setupUi(this);

    initPage();

}


denglu_govern::~denglu_govern()

{

    delete ui;

}


void denglu_govern::initPage(){

    m_add=new flight_add(this);

    m_delete=new flight_delete(this);

    m_sereach=new Flight_sereach(this);

    ui->stackedWidget->addWidget(m_add);

    ui->stackedWidget->addWidget(m_delete);

    ui->stackedWidget->addWidget(m_sereach);

    ui->stackedWidget->setCurrentIndex(0);

    auto l=ui->widget->children();

    for(auto it:l)

    {

        if(it->objectName().contains("btn"))

        {

            connect(static_cast<QPushButton*>(it),&QPushButton::clicked,this,&denglu_govern::dealMenu);

        }

    }

}


void denglu_govern::dealMenu()

{

    auto str=sender()->objectName();

    do

    {

        if("btnAdd"==str)

        {

            ui->stackedWidget->setCurrentIndex(0);

            break;

        }

        if("btnDelete"==str)

        {

            ui->stackedWidget->setCurrentIndex(1);

            break;

        }

        if("btnChange"==str)

        {

            ui->stackedWidget->setCurrentIndex(2);

            break;

        }

    }while(false);

}


void denglu_govern::on_btnSereach_clicked()

{

    maneger *maneger1=new maneger(this);

    hide();

    maneger1->show();

}

6.2.2管理员注册代码

#ifndef ZHUCE_GOVERN_H

#define ZHUCE_GOVERN_H


#include <QWidget>


namespace Ui {

class zhuce_govern;

}


class zhuce_govern : public QWidget

{

    Q_OBJECT

public:

    explicit zhuce_govern(QWidget *parent = nullptr);

    ~zhuce_govern();

private slots:

    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:

    Ui::zhuce_govern *ui;

};

#endif // ZHUCE_GOVERN_H
#include "zhuce_govern.h"

#include "ui_zhuce_govern.h"

#include "governor.h"

#include <QMessageBox>


zhuce_govern::zhuce_govern(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::zhuce_govern)

{

    ui->setupUi(this);

    ui->lineEditAccount->setPlaceholderText("请输入手机号");

    ui->lineEditPassword->setPlaceholderText("请输入密码");

    ui->lineEditPassword_2->setPlaceholderText("请再次输入密码");

    ui->lineEditGongHao->setPlaceholderText("请输入工号");

    ui->lineEditName->setPlaceholderText("请输入姓名");

}


zhuce_govern::~zhuce_govern()

{

    delete ui;

}


//返回登录界面

void zhuce_govern::on_pushButton_2_clicked()

{

    this->hide();

    this->parentWidget()->show();

}


void zhuce_govern::on_pushButton_clicked()

{

    //读取已有账户信息,确认是否已经有此账号

    //qDebug()<<("文件打开失败");

    int cnt=0;

    if (!GovernorList.isEmpty()) {

        cnt = GovernorList.size();

    }


    //判断账号是否存在

    bool accountFound = false;

    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditAccount->text()==GovernorList[i].account)

        {

            ui->lineEditAccount->clear();

            ui->lineEditPassword->clear();

            ui->lineEditPassword_2->clear();

            ui->lineEditGongHao->clear();

            ui->lineEditName->clear();

            ui->lineEditAccount->setPlaceholderText("该用户已存在");

            accountFound=true;

            break;

        }

    }


    if(!accountFound)

    {

        if(!ui->lineEditPassword->text().isEmpty() && !ui->lineEditPassword_2->text().isEmpty())

        {

            if(ui->lineEditPassword->text()==ui->lineEditPassword_2->text())

            {

                governor obj;

                obj.name=ui->lineEditName->text().toUtf8();

                obj.password=ui->lineEditPassword->text().toUtf8();

                obj.account=ui->lineEditAccount->text().toUtf8();

                obj.GongHao=ui->lineEditGongHao->text().toUtf8();

                GovernorList.append(obj);


                bool result=governor::saveGovernor(GovernorList);

                if(result)

                {

                    QMessageBox::information(this, "提示", "注册成功");

                    ui->lineEditAccount->clear();

                    ui->lineEditPassword->clear();

                    ui->lineEditPassword_2->clear();

                    ui->lineEditGongHao->clear();

                    ui->lineEditName->clear();

                    this->hide();

                    this->parentWidget()->show();

                }

                else

                {

                    QMessageBox::information(this, "提示", "注册失败");

                }

            }

            else

            {

                ui->lineEditPassword_2->clear();

                ui->lineEditPassword_2->setPlaceholderText("请重新输入密码");

            }

        }

        else

        {

            ui->lineEditPassword->clear();

            ui->lineEditPassword_2->clear();

            ui->lineEditPassword->setPlaceholderText("密码不能为空");

        }

    }

}

6.2.3添加航班代码

#ifndef FLIGHT_ADD_H

#define FLIGHT_ADD_H


#include <QWidget>


namespace Ui {

class flight_add;

}


class flight_add : public QWidget

{

    Q_OBJECT

public:

    explicit flight_add(QWidget *parent = nullptr);

    ~flight_add();

private slots:

    void on_pushButton_clicked();

private:

    Ui::flight_add *ui;

};


#endif // FLIGHT_ADD_H

#include "flight_add.h"

#include "ui_flight_add.h"

#include "global.h"

#include <qpixmap>

#include <QLabel>

#include <QString>

#include <QMessageBox>


flight_add::flight_add(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::flight_add)

{

    ui->setupUi(this);

    ui->lineEditCode->setPlaceholderText("CX2421");

    ui->lineEditDate->setPlaceholderText("12-25");

    ui->lineEditLauTime->setPlaceholderText("10:45");

    ui->lineEditArrTime->setPlaceholderText("12:45");

    ui->lineEditLau->setPlaceholderText("西安");

    ui->lineEditArr->setPlaceholderText("长沙");

    ui->lineEditPrice1->setPlaceholderText("0");

    ui->lineEditPrice2->setPlaceholderText("0");

    ui->lineEditPrice3->setPlaceholderText("0");

    ui->lineEditNum1->setPlaceholderText("0");

    ui->lineEditNum2->setPlaceholderText("0");

    ui->lineEditNum3->setPlaceholderText("0");

}


flight_add::~flight_add()

{

    delete ui;

}


void flight_add::on_pushButton_clicked()

{

    //读取已有账户信息,确认是否已经有此账号

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    //判断账号是否存在

    bool accountFound = false;

    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditCode->text()==flightList[i].num)

        {

            ui->lineEditCode->clear();

            ui->lineEditArrTime->clear();

            ui->lineEditArr->clear();

            ui->lineEditLauTime->clear();

            ui->lineEditLau->clear();

            ui->lineEditPrice1->clear();

            ui->lineEditPrice2->clear();

            ui->lineEditPrice3->clear();

            ui->lineEditNum1->clear();

            ui->lineEditNum2->clear();

            ui->lineEditNum3->clear();

            ui->lineEditDate->clear();

            ui->lineEditCode->setPlaceholderText("该用户已存在");

            accountFound=true;

            break;

        }

    }


    if(!accountFound)

    {

        if(!ui->lineEditCode->text().isEmpty()

            && !ui->lineEditArrTime->text().isEmpty()

            && !ui->lineEditArr->text().isEmpty()

            && !ui->lineEditLauTime->text().isEmpty()

            && !ui->lineEditLau->text().isEmpty()

            && !ui->lineEditPrice1->text().isEmpty()

            && !ui->lineEditPrice2->text().isEmpty()

            && !ui->lineEditPrice3->text().isEmpty()

            && !ui->lineEditNum1->text().isEmpty()

            && !ui->lineEditNum2->text().isEmpty()

            && !ui->lineEditNum3->text().isEmpty()

            && !ui->lineEditDate->text().isEmpty())

        {

                flight obj;

                obj.num=ui->lineEditCode->text().toUtf8();

                obj.qd=ui->lineEditLau->text().toUtf8();

                obj.zd=ui->lineEditArr->text().toUtf8();

                obj.data=ui->lineEditDate->text().toUtf8();


                QString a,b,c,l;

                a=ui->lineEditArrTime->text().toUtf8();

                b=ui->lineEditLauTime->text().toUtf8();

                c='-';

                l=b+c+a;

                obj.time=l;

                obj.jg[0]=ui->lineEditPrice1->text().toInt();

                obj.jg[1]=ui->lineEditPrice2->text().toInt();

                obj.jg[2]=ui->lineEditPrice3->text().toInt();

                obj.rs[0]=ui->lineEditNum1->text().toInt();

                obj.rs[1]=ui->lineEditNum2->text().toInt();

                obj.rs[2]=ui->lineEditNum3->text().toInt();

                obj.zrs=obj.rs[0]+obj.rs[1]+obj.rs[2];

                obj.is_have=obj.is_jg1=obj.is_jg2=obj.is_jg3=0;

                flightList.append(obj);


                bool result=flight::saveFlight(flightList);

                if(result)

                {

                    QMessageBox::information(this, "提示", "添加成功");

                    ui->lineEditCode->clear();

                    ui->lineEditArrTime->clear();

                    ui->lineEditArr->clear();

                    ui->lineEditLauTime->clear();

                    ui->lineEditLau->clear();

                    ui->lineEditPrice1->clear();

                    ui->lineEditPrice2->clear();

                    ui->lineEditPrice3->clear();

                    ui->lineEditNum1->clear();

                    ui->lineEditNum2->clear();

                    ui->lineEditNum3->clear();

                    ui->lineEditDate->clear();

                }

                else

                {

                    QMessageBox::information(this, "提示", "添加失败");

                }


        }

        else

        {

            ui->lineEditCode->clear();

            ui->lineEditArrTime->clear();

            ui->lineEditArr->clear();

            ui->lineEditLauTime->clear();

            ui->lineEditLau->clear();

            ui->lineEditPrice1->clear();

            ui->lineEditPrice2->clear();

            ui->lineEditPrice3->clear();

            ui->lineEditNum1->clear();

            ui->lineEditNum2->clear();

            ui->lineEditNum3->clear();

            ui->lineEditDate->clear();

            ui->lineEditCode->setPlaceholderText("内容不能为空");

        }

    }

}

6.2.4删除航班代码

#ifndef FLIGHT_DELETE_H

#define FLIGHT_DELETE_H


#include <QMessageBox>

#include <QWidget>


namespace Ui {

class flight_delete;

}


class flight_delete : public QWidget

{

    Q_OBJECT

public:

    explicit flight_delete(QWidget *parent = nullptr);

    ~flight_delete();

private slots:

    void on_pushButton_clicked();

private:

    Ui::flight_delete *ui;

};

#endif // FLIGHT_DELETE_H


#include "flight_delete.h"

#include "ui_flight_delete.h"

#include "global.h"


flight_delete::flight_delete(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::flight_delete)

{

    ui->setupUi(this);

    ui->lineEdit->setPlaceholderText("请输入航班号");

}


flight_delete::~flight_delete()

{

    delete ui;

}


void flight_delete::on_pushButton_clicked()

{

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEdit->text()!="")

        {

            if(ui->lineEdit->text()==flightList[i].num)

            {

                flightList.removeAt(i);

                ui->lineEdit->clear();

                flight::saveFlight(flightList);

                QMessageBox::information(this, "提示", "删除成功");

                break;

            }

        }

        else

        {

            ui->lineEdit->setPlaceholderText("输入不能为空");

        }

    }

}

6.2.5查询航班代码

#ifndef FLIGHT_SEREACH_H

#define FLIGHT_SEREACH_H


#include <QWidget>


namespace Ui {

class Flight_sereach;

}


class Flight_sereach : public QWidget

{

    Q_OBJECT

public:

    explicit Flight_sereach(QWidget *parent = nullptr);

    ~Flight_sereach();

private slots:

    void on_pushButton_clicked();

private:

    Ui::Flight_sereach *ui;

};

#endif // FLIGHT_SEREACH_H
#include "flight_sereach.h"

#include "ui_flight_sereach.h"

#include "maneger.h"

#include "global.h"


#include <QTableWidget>

#include <QTableWidgetItem>

#include <qstackedwidget.h>


Flight_sereach::Flight_sereach(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Flight_sereach)

{

    ui->setupUi(this);

    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); // Set horizontal header alignment

    ui->tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); // Set vertical header alignment

    ui->lineEditChu->setPlaceholderText("出发地");

    ui->lineEditDao->setPlaceholderText("到达地");

    ui->lineEditDate->setPlaceholderText("10-23");

}


Flight_sereach::~Flight_sereach()

{

    delete ui;

}


void Flight_sereach::on_pushButton_clicked()

{

    //清空tablewidget

    int counter = ui->tableWidget->rowCount();

    qDebug()<< "counter is" << counter;

    while (counter)

    {

        ui->tableWidget->removeRow(0);

        counter--;

    }


    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    qDebug()<<cnt;

    int cnt_result=0;

    int result[20];

    for(int i=0;i<cnt;i++)

    {

        if(ui->lineEditChu->text()!=""&&ui->lineEditDao->text()!=""&&ui->lineEditDate->text()!="")

        {

            if(ui->lineEditChu->text()==flightList[i].qd

                &&ui->lineEditDao->text()==flightList[i].zd

                &&ui->lineEditDate->text()==flightList[i].data)

            {

                result[cnt_result++]=i;

            }

        }

        else

        {

            ui->lineEditChu->clear();

            ui->lineEditDao->clear();

            ui->lineEditDate->clear();

            ui->lineEditChu->setPlaceholderText("不能为空");

        }

    }

    qDebug()<<cnt_result;

    for(int i=0;i<cnt_result;i++)

    {

        int row = ui->tableWidget->rowCount(); // Get the current row count

        ui->tableWidget->insertRow(row); // Insert a new row at the end

        //ui->tableWidget->setItem(row, 0, new QTableWidgetItem("Your data"))

        ui->tableWidget->setItem(row, 0, new QTableWidgetItem(flightList[result[i]].num));

        ui->tableWidget->setItem(row, 1, new QTableWidgetItem(flightList[result[i]].time));

        QString str = QString::number(flightList[result[i]].jg[0]);

        ui->tableWidget->setItem(row, 2, new QTableWidgetItem(str));

        str = QString::number(flightList[result[i]].jg[1]);

        ui->tableWidget->setItem(row, 3, new QTableWidgetItem(str));

        str = QString::number(flightList[result[i]].jg[2]);

        ui->tableWidget->setItem(row, 4, new QTableWidgetItem(str));

        str = QString::number(flightList[result[i]].rs[0]);

        ui->tableWidget->setItem(row, 5, new QTableWidgetItem(str));

        str = QString::number(flightList[result[i]].rs[1]);

        ui->tableWidget->setItem(row, 6, new QTableWidgetItem(str));

        str = QString::number(flightList[result[i]].rs[2]);

        ui->tableWidget->setItem(row, 7, new QTableWidgetItem(str));


        for(int j=0;j<8;j++)

        {

            ui->tableWidget->item(row, j)->setTextAlignment(Qt::AlignCenter);

        }

    }

}

6.3其他代码

6.3.1航班和乘客定义代码

#ifndef FLIGHT_H

#define FLIGHT_H


#include <QList>

#include <QString>

#include <QTextStream>

#include <QFile>

#include <QDebug>


//1.读入用户的账号,密码,身份证,姓名

//2.读入管理员的账号,密码,姓名

//3.读入航班信息:etc

//4.将这贯穿程序的变量声明为全局变量

struct customer

{

    QString name; //乘客名字

    QString sfz; //身份证

    int type;

    customer* next;

};


class flight

{

public:

    flight();

    QString num;//航班号

    QString qd;//起点

    QString zd;//终点

    QString data;//航班日期

    QString time;//航班起止时间

    int zrs;//总载客人数

    int rs[3];//航班各个等级仓位人数

    int jg[3];//航班各个等级仓位价格

    int is_have;//已有乘客人数

    int is_jg1,is_jg2,is_jg3;//各等级仓位已有人数

    customer* have=NULL;


    static QList<flight> readFlight();

    static bool saveFlight(const QList<flight>& flightList);

    void save_customer(flight&);

    void read_customer(flight&);

};


#endif // FLIGHT_H
#include "flight.h"

flight::flight(){}

void flight::save_customer(flight& obj)

{

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\hangBan\\"+obj.num+".txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text| QIODevice::Truncate))

    {

        qDebug()<<"文件打开失败";

    }

    QTextStream out(&file);

    if (file.isOpen())

    {

        customer* tmp = obj.have;

        while (tmp)

        {

            out << tmp->name << "," <<tmp->sfz << "," <<tmp->type<<"\n";

            tmp = tmp->next;

        }

        file.close();

    }

    else

    {

        qDebug()<<"文件保存失败";

    }

}


void flight::read_customer(flight& f)

{

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\hangBan\\"+f.num+".txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

    {

        qDebug()<<"文件打开失败";

    }

    f.is_have = 0;

    f.is_jg1=f.is_jg2=f.is_jg3=0;

    QTextStream in(&file);

    while (!in.atEnd())

    {

        customer* tmp = new customer; // 创建新的customer对象

        QString line = in.readLine();

        QStringList parts = line.split(","); // 假设每行数据用逗号分隔

        if (parts.size() >= 3)

        {

            tmp->name=parts[0];

            tmp->sfz=parts[1];

            tmp->type=parts[2].toInt();

        }

        if(tmp->type==1)

            f.is_jg1++;

        if(tmp->type==2)

            f.is_jg2++;

        if(tmp->type==3)

            f.is_jg3++;

        tmp->next = f.have; // 将新的customer对象连接到链表中

        f.have = tmp;

        f.is_have++;

    }

    file.close();

}


QList<flight> flight::readFlight() {

    QList<flight> flightList;


    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\flight.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

        return flightList;


    QTextStream in(&file);

    while (!in.atEnd()) {

        QString line = in.readLine();

        QStringList parts = line.split(","); // 假设每行数据用逗号分隔

        if (parts.size() >= 16) {

            flight info;

            info.num = parts[0];

            info.qd = parts[1];

            info.zd = parts[2];

            info.data = parts[3];

            info.time = parts[4];

            info.zrs = parts[5].toInt();

            info.rs[0] = parts[6].toInt();

            info.rs[1] = parts[7].toInt();

            info.rs[2] = parts[8].toInt();

            info.jg[0] = parts[9].toInt();

            info.jg[1] = parts[10].toInt();

            info.jg[2] = parts[11].toInt();

            info.is_have = parts[12].toInt();

            info.is_jg1 = parts[13].toInt();

            info.is_jg2 = parts[14].toInt();

            info.is_jg3 = parts[15].toInt();


            //读取乘客数据

            flightList.append(info);

        }

    }


    file.close();


    return flightList;

}


bool flight::saveFlight(const QList<flight> &flightList) {

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\flight.txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

        return false;

    QTextStream out(&file);

    for (const flight& info : flightList) {

        out << info.num << "," << info.qd << "," << info.zd << "," << info.data << "," << info.time << "," << info.zrs;

        out<< ","<< info.rs[0] << "," << info.rs[1] << "," << info.rs[2] << "," << info.jg[0] << "," << info.jg[1] << "," ;

        out<< info.jg[2] << "," << info.is_have << ","<< info.is_jg1 << ","<< info.is_jg2 << ","<< info.is_jg3 << "\n";

    }

    file.close();

    return true;

}

6.3.2用户定义代码

#ifndef USER_H

#define USER_H


#include <QList>

#include <QString>

#include <QTextStream>

#include <QFile>

class user

{

public:

    user();


    QString phone;

    QString password;

    QString name;

    QString sfz;

    static QList<user> readUser();

    static bool saveUser(const QList<user>& userList);

};

extern QList<user> userList;

#endif // USER_H
#include "user.h"


user::user(){}


QList<user> user::readUser() {

    QList<user> userList;

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\user.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

        return userList;

    QTextStream in(&file);

    while (!in.atEnd()) {

        QString line = in.readLine();

        QStringList parts = line.split(","); // 假设每行数据用逗号分隔

        if (parts.size() >= 4) {

            user info;

            info.name = parts[0];

            info.password = parts[1];

            info.phone = parts[2];

            info.sfz = parts[3];

            userList.append(info);

        }

    }

    file.close();

    return userList;

}


bool user::saveUser(const QList<user> &userList) {

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\user.txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

        return false;


    QTextStream out(&file);

    for (const user& info : userList) {

        out << info.name << "," << info.password << "," << info.phone << "," << info.sfz << "\n";

    }

    file.close();

    return true;

}

6.3.3管理员定义代码

#ifndef GOVERNOR_H

#define GOVERNOR_H


#include <QList>

#include <QString>

#include <QTextStream>

#include <QFile>

class governor

{

public:

    governor();

    QString name;

    QString account;

    QString password;

    QString GongHao;

    static QList<governor> readGovernor();

    static bool saveGovernor(const QList<governor>& GovernorList);

};

extern QList<governor> GovernorList;


#endif // GOVERNOR_H
#include "governor.h"


governor::governor(){}


QList<governor> governor::readGovernor() {

    QList<governor> GovernorList;


    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\governor.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

        return GovernorList;


    QTextStream in(&file);

    while (!in.atEnd()) {

        QString line = in.readLine();

        QStringList parts = line.split(","); // 假设每行数据用逗号分隔

        if (parts.size() >= 4) {

            governor info;

            info.name = parts[0];

            info.account = parts[1];

            info.password = parts[2];

            info.GongHao = parts[3];

            GovernorList.append(info);

        }

    }

    file.close();

    return GovernorList;

}


bool governor::saveGovernor(const QList<governor> &GovernorList) {

    QFile file("C:\\Users\\86183\\Desktop\\语言学习\\C++\\航空订票系统\\governor.txt");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

        return false;

    QTextStream out(&file);

    for (const governor& info : GovernorList) {

        out << info.name << "," << info.account << "," << info.password << "," << info.GongHao << "\n";

    }

    file.close();

    return true;

}

6.3.4全局变量

#ifndef GLOBAL_H

#define GLOBAL_H

#include <QList>

#include <QString>

#include "flight.h"


extern QList<flight> flightList;

extern int Array[20];

extern int Record[20];

extern int flag,num,flag_self,flag_gai;


#endif // GLOBAL_H

6.3.5主函数

#include "cell_main.h"

#include <QApplication>

#include <QString>

#include <QDebug>

#include <QFile>

#include <QList>


#include "user.h"

#include "governor.h"

#include "global.h"

#include "flight.h"


int flag;

int num;

int flag_gai;

int flag_self;

int Array[20];

int Record[20];

QList<user> userList;

QList<flight> flightList;

QList<governor> GovernorList;

//1.读入用户的账号,密码,身份证,姓名

//2.读入管理员的账号,密码,姓名

//3.读入航班信息:etc

//4.将这贯穿程序的变量声明为全局变量

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    //1.读入航班信息

    flightList=flight::readFlight();

    //2.读入用户信息

    userList=user::readUser();

    //3.读入管理员信息

    GovernorList=governor::readGovernor();

    //4.读入航班旅客信息

    int cnt=0;

    if (!flightList.isEmpty()) {

        cnt = flightList.size();

    }

    for(int i=0;i<cnt;i++)

    {

        flightList[i].read_customer(flightList[i]);

    }


    Cell_Main w;

    w.show();

    return a.exec();

}

        喜欢的小伙伴还请点赞收藏,(❁´◡`❁)( o=^•ェ•)o ┏━┓


  • 18
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值