Qt学生管理系统选课功能的实现

本人只是Qt小白,最近在做期末大作业——学生管理系统的时候发现实现选课功能的时候走了很多弯路,因此写了这篇文章,帮助和当时的我一样不会写选课的朋友们~功能比较简单,但是可以解燃眉之急。

最终效果

这是我的选课界面。因为比较懒,所以设置了一旦选课不得退课要求(如果后期实现了退课会更新在后面)

当我勾选选课勾选框之后,会把该课添加到第一页的课程界面(这里以勾选编号0004的选修课为例)

因为是刚选的课,所以我把得分都设置为了0。

实现方法

选修课的储存

这里我定义了一个储存course类型的vector数组optcourseForAll;course结构体的定义也放在下面了;

struct course{
    QString c_name;//课程名字
    QString teacher;
    QString score;//学分
    QString grades;//成绩
    QString number;//课程编号
    course(QString name,QString teacher,QString score,QString g,QString num){
        c_name=name;
        this->teacher=teacher;
        this->score=score;
        this->grades=g;
        this->number=num;
    }
    course& operator=(const course& other) {
        if (this != &other) { // 避免自我赋值
            this->c_name = other.c_name;
            this->teacher = other.teacher;
            this->score = other.score;
            this->grades = other.grades;
            this->number = other.number;
        }
        return *this; // 返回引用,以便可以连续赋值
    }


};

我在初始化的时候选择了比较原始的方法,先把这些课程的名字放在list5中,再让gpt帮我想了一些虚拟的老师的名字,然后储存到list6中;最后全部放到optcourseForAll中。

    //选修课初始化
    QStringList list5;//art
    list5<<"中国古代文学";list5<<"中国现代文学";list5<<"外国文学";list5<<"历史学";list5<<"哲学";
    list5<<"社会学";list5<<"政治学";list5<<"法学";list5<<"经济学";list5<<"管理学";
    list5<<"线性代数";list5<<"概率论与数理统计";list5<<"大学物理";list5<<"大学化学";
            list5<<"大学生物学";list5<<"计算机科学";list5<<"电子技术";list5<<"机械设计";list5<<"建筑设计";
    list5<<"篮球";list5<<"足球";list5<<"乒乓球";list5<<"羽毛球";list5<<"游泳";list5<<"田径";list5<<"健身操";list5<<"瑜伽";list5<<"跆拳道";list5<<"武术";
            list5<<"西班牙语";list5<<"日语";list5<<"诗词中的音乐";
        QStringList list6;
    list6<<"李华阳";
    list6<<"张子萱";
    list6<<"王思敏";
    list6<<"刘欣怡";
    list6<<"赵文博";
    list6<<"绥佳悦";
    list6<<"周凯旋";
    list6<<"吴梦婷";
    list6<<"郑博文";
    list6<<"陈韵熙";list6<<"林子涵";list6<<"谭雅琪";list6<<"宋宇轩";list6<<"杨瑾瑜";
    list6<<"马浩然";list6<<"张晨曦";list6<<"赵立诚";list6<<"孙磊岩";list6<<"周洁如";
    list6<<"吴佳霓";list6<<"郑凯风";list6<<"李娜莎";list6<<"王浩宇";list6<<"陈曦蕾";
    list6<<"林雪瑶";list6<<"谭超然";list6<<"宋翔宇";list6<<"杨莉娜";list6<<"马奔腾";
    list6<<"张思琪";list6<<"赵梓宇";list6<<"孙悦心";

        for(int i=0;i<list5.size();i++)
    {
        int num=4;
        QString number1;
        if(num+i<10)
        {
             number1="000"+QString::number(num+i);
        }
       else  number1="00"+QString::number(num+i);
        course temp(list5[i],list6[i],"2","0",number1);
        optcourseForAll.push_back(temp);
    }

ui界面

在ui界面,我选择了使用tabwidget和tablewidget相结合的方式来实现分页和表格

tablewidget设置

            ui->tableWidget_2->setRowCount(Widget::optcourseForAll.size());//设置行数
            ui->tableWidget_2->setColumnCount(5);//设置列数
            QStringList labels2;
            QString str2;
            QTableWidgetItem *item2;
            labels2<<"课程编号"<<"课程名称"<<"授课教师"<<"学分"<<"选课状态";
            ui->tableWidget_2->setHorizontalHeaderLabels(labels2);//设置表头
            for(int i=0;i<Widget::optcourseForAll.size();i++){
                for(int j=0;j<ui->tableWidget_2->columnCount();j++){
                    if(j==0)
                    {
                        str2=Widget::optcourseForAll[i].number;
                        qDebug()<<Widget::optcourseForAll[i].number;
                        item2=new QTableWidgetItem(str2);
                        ui->tableWidget_2->setItem(i,j,item2);
                         ui->tableWidget_2->item(i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//设置居中显示
                    }
                    else if(j==1)
                    {
                        str2=Widget::optcourseForAll[i].c_name;
                        item2=new QTableWidgetItem(str2);
                        ui->tableWidget_2->setItem(i,j,item2);
                         ui->tableWidget_2->item(i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                    }
                    else if(j==2){
                        str2=Widget::optcourseForAll[i].teacher;
                        item2=new QTableWidgetItem(str2);
                        ui->tableWidget_2->setItem(i,j,item2);
                         ui->tableWidget_2->item(i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                    }
                    else if(j==3){
                        str2=Widget::optcourseForAll[i].score;
                        item2=new QTableWidgetItem(str2);
                        ui->tableWidget_2->setItem(i,j,item2);
                        ui->tableWidget_2->item(i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
                    }
                    else if(j==4){
                        QTableWidgetItem *check=new QTableWidgetItem;
                        check->setText("选课");
                        check->setCheckState(Qt::Unchecked);
                        ui->tableWidget_2->setItem(i,j,check);
                        ui->tableWidget_2->item(i,j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

                    }
                }
            }
            ui->tableWidget_2->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置列宽自适应
            ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);//设置整行选中
            ui->tableWidget_2->setEditTriggers(QAbstractItemView::NoEditTriggers);//双击禁止修改
            

其他都比较简单,重点在于j=4的时候插入checkBox的方式。

输入完以上代码,你就能看到这个界面了

checkBox状态检测

接下来是实现选课功能的重点,如何做到当勾选一个选课勾选框之后,能马上在“课程信息”界面显示出我们选的课呢?这里用到了connect函数

这里的changeTest函数要求先在头文件的private slots里面声明:

函数具体实现如下:就是先把显示课程信息的tablewidget先用clear()清空,再显示一遍。

void mainPage::changeTest(int row, int col){
            qDebug()<<Widget::student.schedule.size();
            if(ui->tableWidget_2->item(row, col)->checkState() == Qt::Checked)//如果选中
            {
                Widget::student.schedule.push_back(Widget::optcourseForAll[row]);//把这个选修课添加到学生课表里面
                ui->tableWidget->clear();//清空页面
                //以下是重新显示“课程信息”界面的代码
                ui->tableWidget->setRowCount(Widget::student.schedule.size());
                ui->tableWidget->setColumnCount(5);
                QStringList labels;
                labels<<"课程编号"<<"课程名称"<<"授课教师"<<"学分"<<"成绩";
                ui->tableWidget->setHorizontalHeaderLabels(labels);
                QString str1;
                QTableWidgetItem *newItem1;
                for(int i=0;i<Widget::student.schedule.size();i++){
                    for(int j=0;j<ui->tableWidget->columnCount();j++)
                    {
                        if(j==0){
                            str1=Widget::student.schedule[i].number;
                        }
                        else if(j==1){
                            str1=Widget::student.schedule[i].c_name;
                        }
                        else if(j==2){
                            str1=Widget::student.schedule[i].teacher;
                        }
                        else if(j==3){
                            str1=Widget::student.schedule[i].score;
                        }
                        else if(j==4)
                        {
                            str1=Widget::student.schedule[i].grades;
                        }
                        newItem1=new QTableWidgetItem(str1);
                        ui->tableWidget->setItem(i,j,newItem1);
                        ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
                    }
                }
                ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
                ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//设置整行选中
                ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//双击禁止修改
            }
}

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用c++/qt写的项目,项目都经测试过,真实可靠,可供自己学习c++/qtQt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、Qt核心特点 1.1.概述 Qt本身并不是一种编程语言,它本质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。 Qt对标准C++进行了扩展,引入了一些新概念和功能,例如信号和槽、对象属性等。Qt的元对象编译器(Meta-Object Compiler,MOC)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。 Qt Core模块是Qt类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目,Qt Core模块则是被自动加入的。 Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt的元对象系统(Meta-Object-System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: 1.QObject类是所有使用元对象系统的类的基类; 2.在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。 3.MOC(元对象编译器)为每个QObject的子类提供必要的代码来实现元对象系统的特征。 构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和连接。 除了信号和槽机制外,元对象还提供如下一些功能。 1.QObject::metaObject()函数返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,例如QMetaObject::className()函数可在运行时返回类的名称字符串。 QObject obj=new QPushButton; obj->metaObject()->className(); 2.QMetaObject::newInstance()函数创建类的一个新的实例。 3.QObject::inherits(const charclassName)函数判断一个对象实例是否是名称为className的类或QObject的子类的实例。 1.3.属性系统 1.属性定义 Qt提供一个Q_PROPERTY()宏可以定义属性,它也是属于元对象系统实现的。Qt的属性系统与C++编译器无关,可以用任何标准的C++编译器编译定义了属性的Qt C++程序。 2.属性的使用 不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过QObject::property()读取属性值,并通过QObject::setProperty()设置属性值。 3.动态属性 QObject::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。 动态属性可以使用QObject::property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。 例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义”名称——值“信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值