本人只是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);//双击禁止修改
}
}