項目介紹:利用Qt實現簡單的學生信息管理
實現功能:實現對信息的添加,刪除,查詢,修改
廢話不多說,直接進入主題:(剛剛學,界面做的不是太美觀,請多包涵)
主界面 - mainWindow && login


一、添加學生 -
1、使用組件有:Dialog 窗口,Label標簽,Line Edit,Spin Box,radio button,check Box,push button。

2、實現思路:
1. 獲取面板上的信息
2.將獲得的信息寫入一個.txt文件中去
3、實現步驟:
1. 更改標簽的名稱,修改標簽后,方便我們去調用。
2. 為性別,和興趣的組件添加一個按鈕組,通過按鈕組,來判斷那個選項被選中
3. 在獲取興趣的時候,我們需要創建一個鏈表,保存按鈕信息,再用for循環遍歷判斷是否按下,再將信息讀入,在讀入信息的時候利用一個小技巧,每個字段信息之間添加一個分隔符,方便下面的文件操作
4.在寫的時候發先,如果按照先前的分割符號添加,在最后的興趣末尾會多一個分割符,要單獨做處理
// 1.獲得用戶輸入的學生信息
QString szInfo;
szInfo += ui->nameLine->text(); // 姓名
szInfo += " ";
szInfo += ui->numLine->text(); // 學號
szInfo += " ";
szInfo += ui->sexBG->checkedButton()->text(); //性別
szInfo += " ";
szInfo += QString().setNum(ui->ageSpin->value()); // 年齡
szInfo += " ";
szInfo += ui->colleageCB->currentText(); //院系
szInfo += " ";
QList<QAbstractButton *> btnList = ui->inBG->buttons();
for (int i = 0;i < btnList.length();++i)
{
if (btnList.at(i)->isChecked()) // 判斷按鈕是否被按下 返回:bool
{
szInfo += btnList.at(i)->text();
szInfo += "-";
}
}
szInfo.remove(szInfo.length()-1,1);
下面對文件的操作,是借鑒幫助文檔給的實現方法,我理解的是利用一個輸入流將信息讀入文件中去(如有不對,希望大家指正一下。)
QFile file("studenInfo.txt");
if (!file.open(QIODevice::WriteOnly |QIODevice::Append| QIODevice::Text))
return;
QTextStream out(&file);
out << szInfo << '\n';
QMessageBox::information(NULL,"iuput state","input success!");
二、瀏覽學生
1、使用的主要組件有:Table View,Combo Box等

2、實現思路
1. 先讀已經添加學生信息
2. 初始化 table view 組件中顯示學生信息的模型
3. 根據所選的查詢信息和其關鍵字對比讀取的信息
4. 顯示符合的信息
3、實現步驟
1.創建一個很重要的成員變量(QList<QString> m_list)來存儲讀出來的文件信息,因為讀出來的信息是一整行信息,我們要把整行信息切割成若干小塊我們需要的信息,切成的信息由 QStringList 的類型變量存儲
2.當切割完信息可以發現,選擇查詢方式一共有4個字段,字段對應的切割塊為,-1,0,1,4,可以用一個數組存下來,這樣可以省去我們一個一個判斷,只需要對應的下標和獲得的關鍵字相匹配,即輸出對應的信息
3.添加一個模型,即添加一個表頭,方便我們對信息的查看,可以新建一個QStandardItemModel對象,讓對象調用其setHorizontalHeaderItem方法去設置表頭的名稱
void queryDlg::readFile()
{
m_list.clear();
QFile file("studenInfo.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
// at.end()判斷是否到了文件尾
while (!in.atEnd()) {
// readLine() 讀取文件的一行
QString line = in.readLine();
// 將文件中的學生信息添加到鏈表對象中去
m_list.append(line);
}
return ;
}
/*初始化列表信息*/
void queryDlg::initModel()
{
// 創建數據模型
m_pmodel = new QStandardItemModel;
// 設置列頭名稱
m_pmodel->setHorizontalHeaderItem(0,new QStandardItem("name"));
m_pmodel->setHorizontalHeaderItem(1,new QStandardItem("number"));
m_pmodel->setHorizontalHeaderItem(2,new QStandardItem("sex"));
m_pmodel->setHorizontalHeaderItem(3,new QStandardItem("age"));
m_pmodel->setHorizontalHeaderItem(4,new QStandardItem("college"));
m_pmodel->setHorizontalHeaderItem(5,new QStandardItem("interes"));
// 添加到table view中去
ui->dataTab->setModel(m_pmodel);
return ;
}
/*顯示所有學生信息*/
void queryDlg::display(int iIndex,QString szKey)
{
m_pmodel->clear();
initModel();
int iRow = 0;
for (int i=0;i<m_list.size();++i)
{
// 獲得鏈表中學生的信息
QString szInfo = m_list.at(i);
// 分割學生信息,成為子串
QStringList sList = szInfo.split(" ");
// 顯示數據
if (iIndex == -1 || sList.at(iIndex).compare(szKey) == 0)
{
for (int j=0;j<sList.size();++j)
{
m_pmodel->setItem(iRow,j,new QStandardItem(sList.at(j)));
}
++iRow;
}
}
}
三、修改學生(修改學生的界面跟添加學生的界面基本一樣,只不過多了“修改”和“下一個”按鈕)
1、實現思路
1. 獲得學生文件信息(和上面讀文件操作一樣)
2.獲得面板中所有信息(和上面獲取的方法一樣)
3.更新存放學生信息的鏈表中對應位置的信息
4.將鏈表中的信息寫入文件
2、實現步驟
1.讀文件。。。。此處和上面一樣
2.獲取面板信息,和上面添加學生一樣
3.設置一個標志初始學生下標的成員變量(m_iCurrIndex)初始值默認為0,因為信息的行號是從0開始,同時它也是下面更新數據的標志,當用戶點擊修改后,m_list中對應位置處(即m_iCurrIndex處)的信息需要被重新修改,這個m_iCurrIndex在這個實現中很重要,正是有了它,才可以很方便的去實現,信息的更新,和信息的瀏覽。
4.最后將鏈表中的信息讀入到文件中,方法和上面一樣,在此不多過多介紹
void modDlg::display()
{
initUI();
if (m_list.size() == 0)
return ;
// 獲得學生信息
QString szInfo = m_list.at(m_iCurrIndex);
// 分解學生信息
QStringList sList = szInfo.split(" ");
if (sList.size() == 0)
return ;
// 1.顯示姓名
ui->nameLine->setText(sList.at(0));
// 2.顯示學號
ui->numLine->setText(sList.at(1));
// 3.顯示年齡
ui->ageSpin->setValue(sList.at(3).toInt());
// 4.顯示性別
QList<QAbstractButton *> sexList = ui->sexBG->buttons(); // 獲得按鈕信息
for (int i = 0;i < sexList.size();++i)
{
if (sexList.at(i)->text().compare(sList.at(2)) == 0) // 獲得信息后與面板信息比較
sexList.at(i)->setChecked(true); // 設置信息為true
}
// 5.顯示院系
// 實現方法: 先找到對應文本所對應的下標,然后再顯示下標值對應的文本
int index = ui->colleageCB->findText(sList.at(4));
ui->colleageCB->setCurrentIndex(index);
// 6.顯示興趣
QStringList inList = sList.at(5).split("-");
for (int i = 0;i<inList.size();++i)
{
checkInBG(inList.at(i));
}
return ;
}
void modDlg::checkInBG(QString in)
{
QList<QAbstractButton *> inList = ui->inBG->buttons();
for (int i = 0;i < inList.size();++i)
{
if (inList.at(i)->text().compare(in) == 0)
inList.at(i)->setChecked(true);
}
return ;
}
void modDlg::on_nextBtn_clicked()
{
if (m_iCurrIndex++ >= m_list.size() - 1)
{
int ret = QMessageBox::information(NULL,"information","Are you restart?","Yes","No");
if (0 == ret)
m_iCurrIndex = 0;
else
return ;
}
display();
return ;
}
四、刪除學生 (組件很簡單,不去做過多的介紹)

1、實現思路
1.獲取用戶輸入的關鍵字
2.讀文件分割信息匹配關鍵字
3.寫入文件
2、實現步驟 (到了后面步驟基本都近似相同,有些方法可以直接拿過來使用)
1.創建對象獲取關鍵字信息,類型QString
2.讀文件,將數據存入鏈表中
3.循環遍歷鏈表,分割鏈表,使其成為一個個子串並和獲取的關鍵字信息比較,如果符合跳過,不符合將其保存到另一個QString對象中,最后將其寫入文件。注意:這里不再是追加Append,要把它去掉,從第0行開始寫
m_list.clear(); // 1.讀取用戶輸入的信息 QString szInfo1,szInfo2,szInfo,szInfo3; QStringList sList; szInfo1 += ui->nameLine->text(); // 姓名 szInfo2 += ui->numLine->text(); // 學號 // 2.讀取studen.txt中的信息 存到 m_list中 QFile file1("studenInfo.txt"); if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file1); // at.end()判斷是否到了文件尾 while (!in.atEnd()) { // readLine() 讀取文件的一行 QString line = in.readLine(); // 將文件中的學生信息添加到鏈表對象中去 m_list.append(line); } QFile file("studenInfo.txt"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; for (int i = 0;i<m_list.size();++i) { // 獲得鏈表中學生的信息 szInfo = m_list.at(i); // 分割學生信息,成為子串 sList = szInfo.split(" "); // 3.用戶輸入的信息和m_list進行比較 相同則刪除 if (!(sList.at(0).compare(szInfo1)==0&&sList.at(1).compare(szInfo2)==0)) { szInfo3 += m_list.at(i); szInfo3 += '\n'; } } QTextStream out(&file); out << szInfo3 ; QMessageBox::information(NULL,"Prompt","Delete Success!");
一些零碎的方法:比如,1、添加資源圖片方法:選擇資源文件,更改前綴夠再點擊添加文件。2、更改界面背景,字體大小,字體顏色選中組件右鍵點擊更改樣式,選擇要更改的樣式。3、更改窗口名稱,右下角的windowTitle選項可以直接更改。4、設置窗口不能拉伸,將窗口的minsize和maxsize設為相同數值。5、幫助->索引,可以查看QT庫中所有類,和使用方法。等
總結:這次的項目實訓,收獲頗多,但也有許多不足,寫代碼的時候錯誤百出,但是也正是在找錯,改錯的過程中,學到了許多東西,也讓我見識到了編程語言的強大型,以前總感覺學這些語言太過於抽象,不知道用它來做什么,經過這些小的訓練,才發現語言的奧妙,我相信我會在這條路上越走越遠。
