摘要:該文利用 Qt應(yīng)用框架,應(yīng)用Qt信號槽機(jī)制實(shí)現(xiàn)了一個學(xué)生信息管理系統(tǒng)。系統(tǒng)具有添加,修改,分類查詢,刪除,計(jì)算總分及退出等功能。學(xué)生成績管理系統(tǒng)是一個集繼承、圖形界面、事件處理等面向?qū)ο缶幊讨R的綜合應(yīng)用的實(shí)例程序。
關(guān)鍵詞:Qt;C++;槽函數(shù);信息管理系統(tǒng)
中圖分類號:TP311? ? ? ?文獻(xiàn)標(biāo)識碼:A? ? ? 文章編號:1009-3044(2018)36-0046-03
大部分大學(xué)一年級學(xué)生初接觸到的是C/C++計(jì)算機(jī)編程語言,而用C/C++語言編寫界面程序時多在黑屏白字的application console下采用文字描述模擬菜單選擇,學(xué)生體驗(yàn)感及成就感較差。而初學(xué)者只有一定的C++面向?qū)ο缶幊袒A(chǔ),可以使用Qt輕松實(shí)現(xiàn)圖形界面編程。本文利用Qt圖形庫,采用 C++語法,在Qt Creator集成開發(fā)環(huán)境下,實(shí)現(xiàn)了一個基于Qt的學(xué)生成績管理系統(tǒng)。
1 Qt的特點(diǎn)
Qt被用于高性能的跨平臺軟件開發(fā),它是一個標(biāo)準(zhǔn)的技術(shù)成熟的C++框架,Qt不僅擁有擴(kuò)展的C++類庫,還提供了大量可用來快速編寫應(yīng)用程序的工具[1],Qt是采用C++實(shí)現(xiàn)的框架。Qt Creator是一款新的輕量級集成開發(fā)環(huán)境(IDE),IDE支持跨平臺運(yùn)行,支持的系統(tǒng)包括 Mac OS X 、Linux( 32 位及 64 位)以及Windows等系統(tǒng)。Qt Creator的設(shè)計(jì)目標(biāo)是方便開發(fā)人員利用Qt這個應(yīng)用程序框架更加快速、輕易地完成相關(guān)開發(fā)任務(wù)[2]。
2 系統(tǒng)功能
學(xué)生信息管理系統(tǒng)主要功能包括:學(xué)生基本信息和成績的錄入,瀏覽、查詢、刪除、修改及計(jì)算成績等功能。功能分析如下:
1) 添加/輸入學(xué)生信息:輸入的學(xué)生信息包括學(xué)生姓名,學(xué)號,性別,出生日期,英語成績,語文成績,數(shù)學(xué)成績。
2) 查詢學(xué)生信息:可以按姓名、學(xué)號、性別進(jìn)行分類查詢,及全部查詢,從而把所有學(xué)生記錄重新全部顯示出來。其中分類查詢支持模糊查詢,如按姓名查詢時可以把包括“張”字的多條學(xué)生記錄查詢出來。
3) 計(jì)算總分功能:在輸入學(xué)生基本信息及各科成績后,系統(tǒng)自動計(jì)算各科成績總分。
4) 修改功能:可以對學(xué)生的基本信息及各科成績進(jìn)行修改,并有提示確認(rèn)修改對話框。當(dāng)修改了學(xué)生的各科成績后,學(xué)生成績的總分自動重新計(jì)算并修改。當(dāng)各科成績未做改動時,修改其總分,總分不會有變化。
5) 刪除功能:可以刪除選定學(xué)生記錄,并提示確認(rèn)刪除操作,若取消刪除操作,則不執(zhí)行刪除操作,若確定刪除,則實(shí)現(xiàn)學(xué)生記錄的刪除。
3 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
通過在Qt Creater環(huán)境中新建一個Qt Widgets Application應(yīng)用程序,并新建一個繼承于QMainWindow類的MainWindow窗口類,設(shè)計(jì)一個主界面,方便用戶添加學(xué)生信息,管理學(xué)生信息功能的選擇,其中管理學(xué)生信息包括了對學(xué)生信息的瀏覽,查詢,修改,刪除等功能,如圖1所示。
3.1 添加學(xué)生信息功能
通過單擊主界面中的“添加學(xué)生信息”按鈕,進(jìn)入圖2所示inputDialog界面。InputDialog界面類是在Qt Creator開發(fā)環(huán)境中界面文件下通過添加繼承于QDialog類自動生成。在Qt中為了能實(shí)現(xiàn)事件處理及界面跳轉(zhuǎn)可以通過對控件的信號函數(shù)添加槽函數(shù),當(dāng)單擊圖1的“添加學(xué)生信息”按鈕時,發(fā)出一個click信號,再在click信號函數(shù)上添加on_inputButton_clicked()槽函數(shù)來實(shí)現(xiàn)從主界面到添加學(xué)生信息界面的跳轉(zhuǎn)。
在inputDialog界面中分別插入姓名,學(xué)號,性別,出生日期,英語,數(shù)學(xué),語文QLable標(biāo)簽控件。性別做成QRadioButton單選按鈕控件,出生日期對應(yīng)插入QDate Edit控件,用于避免輸入日期格式的不一致,在其他QLable標(biāo)簽后面插入QLineEdit單行文本框控件以實(shí)現(xiàn)各類學(xué)生信息數(shù)據(jù)的輸入,如圖2所示。
單擊“保存”按鈕實(shí)現(xiàn)學(xué)生信息的添加并保存于student.txt磁盤文件中,并在InputDialog界面清空掉前一次所輸入信息。在“保存”按鈕的click信號函數(shù)上添加on_saveButton_clicked()槽函數(shù)實(shí)現(xiàn)學(xué)生信息保存功能。具體代碼如下:
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();//計(jì)算總分
QStringtotalStr=QString::number(total,'f',2);
QFile file("./student.txt");? ?//文件對象,保存學(xué)生信息
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))//追加打開文件
{return ;}
QTextStream out(&file);//使用輸出流對象寫學(xué)生數(shù)據(jù)入文件
out<<name<<" "<<id<<" "<<sex<<" "<<birthday<<" "<<english<<" "<<math<<" "<<chinese<<" "<<totalStr<<endl;
file.close();
ui→nameEdit→clear();//保存完信息后,清除界面之前輸入的各類信息
……
}
3.2 學(xué)生信息管理功能
在圖1 系統(tǒng)主界面中的“管理學(xué)生信息”按鈕上的click信號函數(shù)上添加槽函數(shù),實(shí)現(xiàn)主界面到EditDialog界面類的切換。在editDialog界面(如圖3)中,可以瀏覽所有學(xué)生的信息,同時實(shí)現(xiàn)了學(xué)生信息的查詢,刪除,修改等功能。在editDialog頁面中插入QTableView表格控件實(shí)現(xiàn)學(xué)生信息的瀏覽顯示,使用QTableView顯示數(shù)據(jù)需要通過ui→tableView→setModel()方法將表格對象tableView與QStandardItemModel類對象stu_model進(jìn)行關(guān)聯(lián),另外再在EditDialog類中定義QListstu_list成員變量來存放從文件中讀取到的所有學(xué)生信息,再將stu_list中的學(xué)生信息通過循環(huán)逐條置于stu_model中,從而實(shí)現(xiàn)在與stu_model關(guān)聯(lián)的表格對象tableView中顯示學(xué)生信息。為實(shí)現(xiàn)頁面進(jìn)入editDialog頁面時就能瀏覽所有學(xué)生的信息,因此上面所述瀏覽學(xué)生信息功能在EditDialog類的構(gòu)造函數(shù)中進(jìn)行實(shí)現(xiàn)。
1) 查詢功能的實(shí)現(xiàn)
在圖3的QComBox下拉列表控件中添加各分類查詢項(xiàng),在其后添加QTextEdit控件以用于輸入查詢內(nèi)容,再在“查詢”按鈕的click信號函數(shù)上添加on_searchButton_clicked()槽函數(shù)實(shí)現(xiàn)分類模糊查詢功能。在實(shí)現(xiàn)分類模糊查詢時,首先將stu_Model中的數(shù)據(jù)清除,再通過ui→findcomboBox→currentIndex()獲取當(dāng)前查詢選項(xiàng),由于在初始化圖3界面時,stu_list中存放著文件中所有學(xué)生記錄,因此把輸入的查詢內(nèi)容與stu_list中存放的學(xué)生信息按查詢字段進(jìn)行逐條比較,如果不同則continue略過本次循環(huán),否則把本條記錄重置于與表格關(guān)聯(lián)的stu_model中,以作為多條或單條查詢結(jié)果記錄顯示于tableView表格中。
代碼如下:
void EditDialog::on_searchButton_clicked()
{
int rows=stu_model→rowCount();
for(int i=0;i<rows;i++)//將stu_Model中所有行的數(shù)據(jù)清除
{? ? stu_model→removeRow(0);? }
int index=ui→findcomboBox→currentIndex();//獲得分類查詢項(xiàng)的index值
QStringinputFind=ui→searchEdit→text().trimmed();//獲得查詢內(nèi)容
int row=0;
for(int i=0;i<stu_list.size();i++)//將文件中滿足條件的學(xué)生信息重置于stu_model中
{
QString s=stu_list[i];
QStringList student=s.split(' ');
if(index==0)
if(!student[0].contains(inputFind)) continue;//用contains()進(jìn)行模糊匹配
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++)//將查詢到的內(nèi)容置于stu_model中并自動關(guān)聯(lián)到tableView對象中再以表格形式顯示,以作為查詢結(jié)果
stu_model→setItem(row,j,new QStandardItem(student[j]));
row++;
}}
2) 刪除功能的實(shí)現(xiàn)
刪除功能的實(shí)現(xiàn)不但在界面的顯示上需要刪除,而且在確認(rèn)刪除后,student.txt文件中的相應(yīng)內(nèi)容也需要刪除。代碼實(shí)現(xiàn)時,首先通過ui→tableView→currentIndex().row()獲取要刪除的行,通過QMessageBox::information()函數(shù)彈出一個確認(rèn)刪除信息提示框,通過選擇yes或no進(jìn)行確認(rèn)或取消刪除,若返回值與QMessageBox::Yes相等表示確認(rèn)刪除,則需要將stu_model中的該條記錄用removeRow(index)刪除,同時把stu_list中的該條記錄也移除,并把stu_list中的內(nèi)容重寫入文件,以保證文件內(nèi)容與界面上所顯示數(shù)據(jù)的一致性。
代碼如下:
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,"確認(rèn)刪除",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) 修改功能的實(shí)現(xiàn)
雙擊圖3表格中的某條記錄的某條字段,該字段將會呈可編輯狀態(tài),從而可以修改某條記錄的相關(guān)字段的內(nèi)容,在代碼實(shí)現(xiàn)時,本文用oldStr來保存修改前的記錄字符串,用newStr來保存修改后的記錄字符串,由于總分值是由三門課程求和所得,若在未修改各科成績的情況下,總分是不能手動修改,即總分始終保持為三科成績之和,所以用newStr2來記錄重新計(jì)算了總成績的記錄字符串。當(dāng)單擊“修改”按鈕,若oldStr不同于newStr時彈出“確認(rèn)修改”對話框,否則不彈出。若確認(rèn)修改,則把當(dāng)前修改的記錄首先從stu_list中刪除,再把newStr2插入到stu_list中修改記錄所在位置處,并將stu_list內(nèi)容重寫入文件,為保持文件內(nèi)容與系統(tǒng)界面顯示內(nèi)容一致,最后再把stu_model中的相應(yīng)記錄重置為修改后的數(shù)據(jù)。若取消修改,則把oldStr中的內(nèi)容重置于stu_model中,以把修改了的數(shù)據(jù)再還原為修改前的狀態(tài)。
代碼如下:
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)? //重新計(jì)算總分
{? QStringscoreStr=stu_model→item(row,col)→text().trimmed();
double score=scoreStr.toDouble();
total+=score;
}}
QStringtotalStr=QString::number(total,'f',2);
newStr2+=totalStr;//將計(jì)算了的總分加入newStr2串中
QStringoldStr=stu_list[row];
if(oldStr.trimmed()!=newStr.trimmed())
{? ?if(QMessageBox::Yes==QMessageBox::information(this,"確認(rèn)修改","確認(rèn)要修改?",QMessageBox::Yes,QMessageBox::No))
{? ?stu_list.removeAt(row);
stu_list.insert(row,newStr2);
……//把stu_list中的內(nèi)容重寫入文件(同刪除功能中重寫文件),使文件內(nèi)容與修改后的內(nèi)容一致
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 結(jié)束語
本系統(tǒng)通過使用Qt應(yīng)用框架呈現(xiàn)出人機(jī)交互界面,采用QTextStrea流對象實(shí)現(xiàn)對QFile對象所關(guān)聯(lián)的文件進(jìn)行讀寫操作,采用Qt信號槽機(jī)制實(shí)現(xiàn)學(xué)生記錄的增,刪,改,查等功能。本程序是在學(xué)習(xí)完C++程序設(shè)計(jì)這門課程后的一個集繼承、圖形界面、事件處理等面向?qū)ο缶幊讨R的綜合應(yīng)用的實(shí)例程序,對于初學(xué)者來說,能更好地培養(yǎng)面向?qū)ο缶幊趟季S及編程興趣,便于理解及掌握,并且對《C++程序設(shè)計(jì)》課程教學(xué)有一定的參考作用。
參考文獻(xiàn):
[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語言的學(xué)生成績管理系統(tǒng)的實(shí)現(xiàn)[J].武漢職業(yè)技術(shù)學(xué)院學(xué)報,2017(4):36-39.
[4] 張會. 基于Java的記事本程序的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識與技術(shù),2017(30):88-90.
[通聯(lián)編輯:謝媛媛]