1. 程式人生 > >QT-實現簡單的學生資訊管理_初識QT

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庫中所有類,和使用方法。等

總結:這次的專案實訓,收穫頗多,但也有許多不足,寫程式碼的時候錯誤百出,但是也正是在找錯,改錯的過程中,學到了許多東西,也讓我見識到了程式語言的強大型,以前總感覺學這些語言太過於抽象,不知道用它來做什麼,經過這些小的訓練,才發現語言的奧妙,我相信我會在這條路上越走越遠。