摘要:该文利用 Qt应用框架,應用Qt信号槽机制实现了一个学生信息管理系统。系统具有添加,修改,分类查询,删除,计算总分及退出等功能。学生成绩管理系统是一个集继承、图形界面、事件处理等面向对象编程知识的综合应用的实例程序。
关键词:Qt;C++;槽函数;信息管理系统
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)36-0046-03
大部分大学一年级学生初接触到的是C/C++计算机编程语言,而用C/C++语言编写界面程序时多在黑屏白字的application console下采用文字描述模拟菜单选择,学生体验感及成就感较差。而初学者只有一定的C++面向对象编程基础,可以使用Qt轻松实现图形界面编程。本文利用Qt图形库,采用 C++语法,在Qt Creator集成开发环境下,实现了一个基于Qt的学生成绩管理系统。
1 Qt的特点
Qt被用于高性能的跨平台软件开发,它是一个标准的技术成熟的C++框架,Qt不仅拥有扩展的C++类库,还提供了大量可用来快速编写应用程序的工具[1],Qt是采用C++实现的框架。Qt Creator是一款新的轻量级集成开发环境(IDE),IDE支持跨平台运行,支持的系统包括 Mac OS X 、Linux( 32 位及 64 位)以及Windows等系统。Qt Creator的设计目标是方便开发人员利用Qt这个应用程序框架更加快速、轻易地完成相关开发任务[2]。
2 系统功能
学生信息管理系统主要功能包括:学生基本信息和成绩的录入,浏览、查询、删除、修改及计算成绩等功能。功能分析如下:
1) 添加/输入学生信息:输入的学生信息包括学生姓名,学号,性别,出生日期,英语成绩,语文成绩,数学成绩。
2) 查询学生信息:可以按姓名、学号、性别进行分类查询,及全部查询,从而把所有学生记录重新全部显示出来。其中分类查询支持模糊查询,如按姓名查询时可以把包括“张”字的多条学生记录查询出来。
3) 计算总分功能:在输入学生基本信息及各科成绩后,系统自动计算各科成绩总分。
4) 修改功能:可以对学生的基本信息及各科成绩进行修改,并有提示确认修改对话框。当修改了学生的各科成绩后,学生成绩的总分自动重新计算并修改。当各科成绩未做改动时,修改其总分,总分不会有变化。
5) 删除功能:可以删除选定学生记录,并提示确认删除操作,若取消删除操作,则不执行删除操作,若确定删除,则实现学生记录的删除。
3 系统设计与实现
通过在Qt Creater环境中新建一个Qt Widgets Application应用程序,并新建一个继承于QMainWindow类的MainWindow窗口类,设计一个主界面,方便用户添加学生信息,管理学生信息功能的选择,其中管理学生信息包括了对学生信息的浏览,查询,修改,删除等功能,如图1所示。
3.1 添加学生信息功能
通过单击主界面中的“添加学生信息”按钮,进入图2所示inputDialog界面。InputDialog界面类是在Qt Creator开发环境中界面文件下通过添加继承于QDialog类自动生成。在Qt中为了能实现事件处理及界面跳转可以通过对控件的信号函数添加槽函数,当单击图1的“添加学生信息”按钮时,发出一个click信号,再在click信号函数上添加on_inputButton_clicked()槽函数来实现从主界面到添加学生信息界面的跳转。
在inputDialog界面中分别插入姓名,学号,性别,出生日期,英语,数学,语文QLable标签控件。性别做成QRadioButton单选按钮控件,出生日期对应插入QDate Edit控件,用于避免输入日期格式的不一致,在其他QLable标签后面插入QLineEdit单行文本框控件以实现各类学生信息数据的输入,如图2所示。
单击“保存”按钮实现学生信息的添加并保存于student.txt磁盘文件中,并在InputDialog界面清空掉前一次所输入信息。在“保存”按钮的click信号函数上添加on_saveButton_clicked()槽函数实现学生信息保存功能。具体代码如下:
void InputDialog::on_saveButton_clicked()
{QString name,id,sex,birthday,english,math,chinese;//暂存界面上录入的信息
QString name=ui→nameEdit→text();
QString id=ui→idEdit→text();
……
double total=english.toDouble()+math.toDouble()+chinese.toDouble();//计算总分
QStringtotalStr=QString::number(total,'f',2);
QFile file("./student.txt"); //文件对象,保存学生信息
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))//追加打开文件
{return ;}
QTextStream out(&file);//使用输出流对象写学生数据入文件
out<<name<<" "<<id<<" "<<sex<<" "<<birthday<<" "<<english<<" "<<math<<" "<<chinese<<" "<<totalStr<<endl;
file.close();
ui→nameEdit→clear();//保存完信息后,清除界面之前輸入的各类信息
……
}
3.2 学生信息管理功能
在图1 系统主界面中的“管理学生信息”按钮上的click信号函数上添加槽函数,实现主界面到EditDialog界面类的切换。在editDialog界面(如图3)中,可以浏览所有学生的信息,同时实现了学生信息的查询,删除,修改等功能。在editDialog页面中插入QTableView表格控件实现学生信息的浏览显示,使用QTableView显示数据需要通过ui→tableView→setModel()方法将表格对象tableView与QStandardItemModel类对象stu_model进行关联,另外再在EditDialog类中定义QListstu_list成员变量来存放从文件中读取到的所有学生信息,再将stu_list中的学生信息通过循环逐条置于stu_model中,从而实现在与stu_model关联的表格对象tableView中显示学生信息。为实现页面进入editDialog页面时就能浏览所有学生的信息,因此上面所述浏览学生信息功能在EditDialog类的构造函数中进行实现。
1) 查询功能的实现
在图3的QComBox下拉列表控件中添加各分类查询项,在其后添加QTextEdit控件以用于输入查询内容,再在“查询”按钮的click信号函数上添加on_searchButton_clicked()槽函数实现分类模糊查询功能。在实现分类模糊查询时,首先将stu_Model中的数据清除,再通过ui→findcomboBox→currentIndex()获取当前查询选项,由于在初始化图3界面时,stu_list中存放着文件中所有学生记录,因此把输入的查询内容与stu_list中存放的学生信息按查询字段进行逐条比较,如果不同则continue略过本次循环,否则把本条记录重置于与表格关联的stu_model中,以作为多条或单条查询结果记录显示于tableView表格中。
代码如下:
void EditDialog::on_searchButton_clicked()
{
int rows=stu_model→rowCount();
for(int i=0;i<rows;i++)//将stu_Model中所有行的数据清除
{ stu_model→removeRow(0); }
int index=ui→findcomboBox→currentIndex();//获得分类查询项的index值
QStringinputFind=ui→searchEdit→text().trimmed();//获得查询内容
int row=0;
for(int i=0;i<stu_list.size();i++)//将文件中满足条件的学生信息重置于stu_model中
{
QString s=stu_list[i];
QStringList student=s.split(' ');
if(index==0)
if(!student[0].contains(inputFind)) continue;//用contains()进行模糊匹配
if(index==1)
if(!student[1].contains(inputFind)) continue;
if(index==2)
if(inputFind!=student[2]) continue;
if(index==3)
ui→searchEdit→setText("");
for(int j=0;j<student.size();j++)//将查询到的内容置于stu_model中并自动关联到tableView对象中再以表格形式显示,以作为查询结果
stu_model→setItem(row,j,new QStandardItem(student[j]));
row++;
}}
2) 删除功能的实现
删除功能的实现不但在界面的显示上需要删除,而且在确认删除后,student.txt文件中的相应内容也需要删除。代码实现时,首先通过ui→tableView→currentIndex().row()获取要删除的行,通过QMessageBox::information()函数弹出一个确认删除信息提示框,通过选择yes或no进行确认或取消删除,若返回值与QMessageBox::Yes相等表示确认删除,则需要将stu_model中的该条记录用removeRow(index)删除,同时把stu_list中的该条记录也移除,并把stu_list中的内容重写入文件,以保证文件内容与界面上所显示数据的一致性。
代码如下:
void EditDialog::on_delButton_clicked()
{
int index=ui→tableView→currentIndex().row();
QString s=stu_list[index];
QStringList student=s.split(' ');
QString info="确定要删除 "+student[0]+" 吗?";
if(QMessageBox::Yes==QMessageBox::information(this,"确认删除",info,QMessageBox::Yes,QMessageBox::No))
{ stu_model→removeRow(index);
stu_list.removeAt(index);
//重写文件
QFile file("./student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
{return;}
QTextStream out(&file);
for(int i=0;i<stu_list.size();i++)
{ out<<stu_list[i]<<endl; }
}}
3) 修改功能的实现
双击图3表格中的某条记录的某条字段,该字段将会呈可编辑状態,从而可以修改某条记录的相关字段的内容,在代码实现时,本文用oldStr来保存修改前的记录字符串,用newStr来保存修改后的记录字符串,由于总分值是由三门课程求和所得,若在未修改各科成绩的情况下,总分是不能手动修改,即总分始终保持为三科成绩之和,所以用newStr2来记录重新计算了总成绩的记录字符串。当单击“修改”按钮,若oldStr不同于newStr时弹出“确认修改”对话框,否则不弹出。若确认修改,则把当前修改的记录首先从stu_list中删除,再把newStr2插入到stu_list中修改记录所在位置处,并将stu_list内容重写入文件,为保持文件内容与系统界面显示内容一致,最后再把stu_model中的相应记录重置为修改后的数据。若取消修改,则把oldStr中的内容重置于stu_model中,以把修改了的数据再还原为修改前的状态。
代码如下:
void EditDialog::on_modifyButton_clicked()
{int row=ui→tableView→currentIndex().row();
QStringnewStr,newStr2;
double total=0;
for(int col=0;col<8;col++)
{newStr+=stu_model→item(row,col)→text()+" ";//包含总成绩
if(col<7) newStr2+=stu_model→item(row,col)→text()+" ";//不包含总成绩
if(col>=4&&col<7) //重新计算总分
{ QStringscoreStr=stu_model→item(row,col)→text().trimmed();
double score=scoreStr.toDouble();
total+=score;
}}
QStringtotalStr=QString::number(total,'f',2);
newStr2+=totalStr;//将计算了的总分加入newStr2串中
QStringoldStr=stu_list[row];
if(oldStr.trimmed()!=newStr.trimmed())
{ if(QMessageBox::Yes==QMessageBox::information(this,"确认修改","确认要修改?",QMessageBox::Yes,QMessageBox::No))
{ stu_list.removeAt(row);
stu_list.insert(row,newStr2);
……//把stu_list中的内容重写入文件(同删除功能中重写文件),使文件内容与修改后的内容一致
QStringListnewStr2List=newStr2.split(' ');
for(int i=0;i<7;i++)
{ stu_model→setItem(row,i,new QStandardItem(newStr2List[i])); }
stu_model→setItem(row,7,new QStandardItem(totalStr));
}else
{ QStringListstus=oldStr.split(' ');
for(int col=0;col<8;col++)
stu_model→setItem(row,col,new QStandardItem(stus[col]));
}}}
4 结束语
本系统通过使用Qt应用框架呈现出人机交互界面,采用QTextStrea流对象实现对QFile对象所关联的文件进行读写操作,采用Qt信号槽机制实现学生记录的增,删,改,查等功能。本程序是在学习完C++程序设计这门课程后的一个集继承、图形界面、事件处理等面向对象编程知识的综合应用的实例程序,对于初学者来说,能更好地培养面向对象编程思维及编程兴趣,便于理解及掌握,并且对《C++程序设计》课程教学有一定的参考作用。
参考文献:
[1] MonteiroFR,GarciaMAP,CordeiroLC,etal.Boundedmodel checkingofC++ programsbasedon theQt cross-platformframework[J].SoftwareTestingVerification&Reliability,2017(5):179-180.
[2] Saleem K,BellahseneZ,HuntE. PORSCHE: PerformanceOriented Schema mediation[J] .Information Systems, 2008,3378:637-657.
[3] 彭莉.基于C语言的学生成绩管理系统的实现[J].武汉职业技术学院学报,2017(4):36-39.
[4] 张会. 基于Java的记事本程序的设计与实现[J].电脑知识与技术,2017(30):88-90.
[通联编辑:谢媛媛]