刚学会C++的萌新如何搞定Qt

目录

简单介绍一下

题目

思路与代码实现

本题的数据结构:

 设计流程:

 文件与对象描述:

代码实现(主函数以及设计师界面类请见链接):

源码食用方法:

总结


简单介绍一下

本人作为南京某不知名985大学的废柴大二软件专业学生,接触C++刚好过去一年,经过一个暑假的大脑清空,C++知识已经模糊不清,如今暑期学校却要用Qt完成大作业,本以为会很吃力,但其实还好。这是我在CSDN上的第一篇文章,不求有多少人看,只求能记录一下,要是某个点能帮助到与我类似的同学,我就很开心了。

我的情况是:刚上完大一,C++基础掌握得不好不差,暑期学校要求用C++在Qt上编写一个汽车客运公司管理系统,算是一个大作业。老师讲解Qt的内容只用了三天,以大作业的代码例子介绍了Qt的主要功能与信号与槽机制,班里的大神只花了一周就完成了大作业,我大概前前后后花了两周。

题目

设某客运公司每日都发售今、明、后三天的班次车票。该系统需创建和管理以下信息:1、 今、明、后三天每个班次的基本信息:班次号、发车时间、终点城市、座位数量、座位数据集;2.每个班次各座位的旅客登记表:姓名、身份证号、座号。

系统功能要求如下:1.创建和管理描述每个班次基本信息的对象;2.创建和管理描述特定班次的座位信息的对象(售票时实现); 3.办理售票,在班次中添加旅客信息(即座位号),座位号不能重复; 4.办理退票,在班次中删除旅客信息; 5. 基本查询功能; 6.数据文件读写:文件中包含所有班次信息、每个班次的座位旅客登记等数据; 7. 基本信息显示:1)显示所有班次;2)显示特定班次的座位旅客登记表; 8.可选功能提升:查询指定班次的余票数和座位号等;

这个题目的难度不算很大,难点主要在于从没接触过Qt。其实在我看来,本题目的各种类,以及基本的功能,都可以用C++先实现,再学习Qt的基础知识也不迟。Qt也只需掌握信号与槽机制(Qt的一大特色之一),以及Qt中与C++有区别的一些库(例如:C++中的vector在Qt中为QVector,string在Qt中为QSring......)除此之外,UI部分各种控件的知识需要用到时再学也行。

思路与代码实现

本题的数据结构:

结构体A_Seat_Info:管理一个座位的座位号,乘客姓名,乘客身份证号。

类A_Bus:管理一辆车的信息,如班次号,发车日期,发车时间,终点城市,座位数量,以及一个大小为50的结构体数组用来存这辆车的所有座位。

类InfoTable:包含要管理的车辆总数,以及一个QVector容器用来存所有车。

 设计流程:

 文件与对象描述:

  1. a_bus.h/.cpp管理一辆车的班次号、发车日期、发车时间、终点、座位数量以及座位数据集(座位号、乘客姓名、乘客身份证),并提供了相应的读文件与写文件函数
  2. infotable.h/.cpp用QVector容器存储多辆车的信息,也提供了相应的读文件与写文件操作以及添加一辆车的信息,从QVector容器返回特定车辆信息等函数
  3. add_a_bus_dialog.h/.cpp/.ui往容器内添加一辆车的信息,用户在UI界面输入班次号、发车日期时间、终点、座位数量,系统生成一辆车的信息并push入容器。
  4. passengerlist_dialog.h/.cpp/.ui在UI界面输入要查询的客车的发车日期及班次号,系统在QTableView中显示某天某班次客车的所有座位信息。
  5. readonlydelegate.h/.cpp/.ui设置QtableView中某列为只读。
  6. refund_dialog.h/.cpp/.ui用户在UI界面输入乘客姓名、选择班次办理退票。
  7. sale_dialog.h/.cpp/.ui用户在UI界面输入乘客姓名、身份证号、选择班次、座位办理售票。
  8. ticketleft_dialog.h/.cpp/.ui查询某班次的余票数。
  9. sale.h/.cpp用于办理售票/退票时存储乘客姓名、身份证、班次号、座位号。
  10. 测试文件:”纯班次表.txt”、”班次和乘客表.txt”。

代码实现(主函数以及设计师界面类请见链接):

A_Bus.h

/*A_Bus.h*/
/*管理一辆车的信息,含该车辆的所有座位的信息*/
#ifndef A_BUS_H
#define A_BUS_H
#include <qstring.h>
#include <QTime>
#include <qdatetime.h>
#include <QTextStream>

//某个座位的座位号、乘客姓名、身份证号
typedef struct A_Seat_Info {
    bool seated;//该座位有人否
    int Seat_Number;
    QString Name;
    QString ID;
}A_Seat_Info;


//某辆客车的班次号、出发时间、目的地、座位数及每个座位的信息
class A_Bus
{
public:
    A_Bus();
    virtual ~A_Bus();

    A_Bus(const A_Bus &temp_A_Bus);
    A_Bus &operator=(const A_Bus &temp_A_Bus);

    void Save_Seats(QTextStream &aStream); //往流文件中写入车的所有座位信息
    void Read_Seats(QTextStream &aStream); //从流文件读车的所有座位信息
    void Save_A_Bus(QTextStream &aStream); //往流文件中写入一辆车信息
    void Read_A_Bus(QTextStream &aStream); //从流文件中读一辆车信息

    int BusID;//班次号
    QString Date;//出发日期
    QString DepTime;//出发时间
    QString Destination;//终点
    int SeatAmount;//座位数量
    A_Seat_Info Seats[50];//客运汽车座位数一般在50以内
};

#endif // A_BUS_H

A_Bus.cpp

#include "a_bus.h"

//构造函数设置每个成员的认值
A_Bus::A_Bus()
{
    BusID=0;
    Date="今天";//日期认为今天
    SeatAmount=0;
    for(int i=0;i<50;i++){
        Seats[i].seated=false;//认每个座位还没有坐人
        Seats[i].Seat_Number=i+1;
        Seats[i].Name="NULL";
        Seats[i].ID="000";
    }
}

//析构
A_Bus::~A_Bus(){

}

//拷贝构造
A_Bus::A_Bus(const A_Bus &temp_A_Bus){
    BusID=temp_A_Bus.BusID;
    Date=temp_A_Bus.Date;
    DepTime=temp_A_Bus.DepTime;
    Destination=temp_A_Bus.Destination;
    SeatAmount=temp_A_Bus.SeatAmount;

    for(int i=0;i<50;i++){
        Seats[i]=temp_A_Bus.Seats[i];
    }
}

//赋值=重载
A_Bus& A_Bus::operator=(const A_Bus &temp_A_Bus){
    BusID=temp_A_Bus.BusID;
    Date=temp_A_Bus.Date;
    DepTime=temp_A_Bus.DepTime;
    Destination=temp_A_Bus.Destination;
    SeatAmount=temp_A_Bus.SeatAmount;

    for(int i=0;i<50;i++){
        Seats[i]=temp_A_Bus.Seats[i];
    }
    return *this;
}

//往流文件中写入车的所有座位信息
void A_Bus::Save_Seats(QTextStream &aStream){
    for(int i=0;i<SeatAmount;i++){
        aStream<<Seats[i].Seat_Number<<" "<<Seats[i].Name<<" "<<Seats[i].ID<<'\n';
    }
}

//从流文件读车的所有座位信息
void A_Bus::Read_Seats(QTextStream &aStream){
    for(int i=0;i<SeatAmount;i++)
        aStream>>Seats[i].Seat_Number>>Seats[i].Name>>Seats[i].ID;
}

//往流文件中写入一辆车信息
void A_Bus::Save_A_Bus(QTextStream &aStream){
    aStream<<BusID<<" "<<Date<<" "<<DepTime<<" "<<Destination<<" "<<SeatAmount<<'\n';
    Save_Seats(aStream);
}

//从流文件中读一辆车信息
void A_Bus::Read_A_Bus(QTextStream &aStream){
    aStream>>BusID>>Date>>DepTime>>Destination>>SeatAmount;
    Read_Seats(aStream);
}

InfoTable.h

/*管理很多辆车的班次信息以及座位信息*/
#ifndef INFOTABLE_H
#define INFOTABLE_H
#include"a_bus.h"
#include <vector>
#include <QVector>

class InfoTable
{
public:
    InfoTable();

    bool Read_Bus_FromFile(const QString &aReadFileName);//从文件读取所有班次信息(包括其座位信息)
    bool Save_Bus_ToFile(const QString &aSaveFileName);//往流文件写入所有班次信息(包括其座位信息)

    void Add_Bus(A_Bus & bus);//往InfoTable的对象里添加一辆车
    A_Bus & Get_A_Bus(int index);//从InfoTable的对象里返回一辆车
    int Get_Bus_Amount();//返回InfoTable的对象里的车辆总数

    QVector<A_Bus>Buses;//存所有的车辆及其座位
    int Bus_Amount;//InfoTable的对象里的车辆总数
};

#endif // INFOTABLE_H

InfoTable.cpp

#include "infotable.h"
#include <qfile.h>
#include <QTextStream>
#include <QTextCodec>

InfoTable::InfoTable()
{
    Bus_Amount=0;
}

//从流文件逐个读车辆信息并push入vector容器
bool InfoTable::Read_Bus_FromFile(const QString &aReadFileName){//给定文件名
    QFile aFile(aReadFileName);
    if(!aFile.exists()) //文件不存在
        return false;
    if(!aFile.open(qiodevice::ReadOnly | qiodevice::Text)) //以文本方式打开
        return false;

    QTextStream aStream(&aFile); //用文本流读取文件
    aStream.setCodec(QTextCodec::codecForName("system")); //显示汉字

    //初始化
    Buses.clear();//将装每辆车的vector池子清零
    Bus_Amount = 0;//车辆总数

    //逐个读取车辆信息
    aStream>>Bus_Amount; //先读车辆总数
    A_Bus tempBus;
    if(Bus_Amount>0)
    {
        for(int i=0; i<Bus_Amount; i++)
        {
            tempBus.Read_A_Bus(aStream);
            Buses.push_back(tempBus);
        }
    }

    aFile.close();//关闭文件
    return true;
}

//将vector容器里的所有车辆信息存入流文件
bool InfoTable::Save_Bus_ToFile(const QString &aSaveFileName){
    QFile aFile(aSaveFileName);
    if(!aFile.open(qiodevice::writeonly| qiodevice::Text)) //保存为文本
        return false;
    QTextStream aStream(&aFile);//用文本流保存文件
    aStream.setCodec(QTextCodec::codecForName("system")); //显示汉字

    //逐个写入车辆信息
    aStream<<Bus_Amount<<'\n';//车辆总数
    if(Bus_Amount>0)
    {
        for(int i=0; i<Bus_Amount; i++)
            Buses[i].Save_A_Bus(aStream);
    }
    aFile.close(); //关闭文件
    return true;
}

//添加一辆车到vector容器
void InfoTable::Add_Bus(A_Bus &bus)
{
    Buses.push_back(bus);
    Bus_Amount++;
}

//返回vector容器指定下标的A_Bus对象
A_Bus & InfoTable::Get_A_Bus(int index){
    return Buses[index];
}

//返回vector容器里存了多少bus
int InfoTable::Get_Bus_Amount(){
    Bus_Amount = Buses.size();
    return Bus_Amount;
}

设计师界面类以及主函数由于代码量太大,我放入链接中:

https://github.com/NaiveGhosttt/bus-company.git

源码食用方法

 解压后打开BusCompany文件夹,删除.pro.user文件后再打开.pro文件就可以看到全部工程代码

总结

这是我的第一篇CSDN文章加上我本人也是刚上大二的学生,所以专业知识层面肯定比不上站内的许多大牛。但我也想有一天能像那些大牛一样,在CSDN分享予人帮助,所以这篇就当是试水了,以后的路还很长,我要一步一步地走下去。

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...