摘要:該文利用 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.
[通聯編輯:謝媛媛]