目录
源码下载链接:
https://download.csdn.net/download/Fatunlorey/89232942?spm=1001.2014.3001.5503https://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
设计功能技术:
- 自定义导航栏开发
- QStackWidget、QTableWidget高级控件
- QPushButton、QLabel、QLineEdit、QWidget、QComBox、QCheckBox、QToolButton
- 自定义布局技术
- 自定义信号与槽
- 界面的迁移逻辑
- 主要文件的保存
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 ┏━┓