QT-實現簡單的學生資訊管理_初識QT
專案介紹:利用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行開始寫
一些零碎的方法:比如,1、新增資源圖片方法:選擇資原始檔,更改字首夠再點選新增檔案。2、更改介面背景,字型大小,字型顏色選中元件右鍵點選更改樣式,選擇要更改的樣式。3、更改視窗名稱,右下角的windowTitle選項可以直接更改。4、設定視窗不能拉伸,將視窗的minsize和maxsize設為相同數值。5、幫助->索引,可以檢視QT庫中所有類,和使用方法。等
總結:這次的專案實訓,收穫頗多,但也有許多不足,寫程式碼的時候錯誤百出,但是也正是在找錯,改錯的過程中,學到了許多東西,也讓我見識到了程式語言的強大型,以前總感覺學這些語言太過於抽象,不知道用它來做什麼,經過這些小的訓練,才發現語言的奧妙,我相信我會在這條路上越走越遠。