Qt-實現簡單的學生信息管理_初識QT

来源:http://www.cnblogs.com/zzuli-liuxin/archive/2016/09/03/5836085.html
-Advertisement-
Play Games

項目介紹:利用Qt實現簡單的學生信息管理 實現功能:實現對信息的添加,刪除,查詢,修改 廢話不多說,直接進入主題:(剛剛學,界面做的不是太美觀,請多包涵) 主界面 - mainWindow && login 一、添加學生 - 1、使用組件有:Dialog 視窗,Label標簽,Line Edit,S ...


項目介紹:利用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庫中所有類,和使用方法。等

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是觀察者模式? 摘自百度百科的說法:觀察者模式(有時又被稱為發佈(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時 ...
  • 紋理映射非常實用,在游戲場景中已經無所不在了. 一個較少的多邊形構成的模形,配合好的紋理貼圖進行映射,可以得到逼真的效果.游戲中的天空,地面,牆面,和植物都是紋理貼圖進行映射的. 例如最終幻想8的男女主角多邊形數量是非常少的,完全靠貼圖保證真實效果。 以前的游戲中的樹木其實就是一個四邊形加上樹木貼圖 ...
  • 想要使用OWA需要一臺單獨的伺服器來部署,這對很多人造成困難。而寫該文的目的是為了分享有個OWA的集成步驟,它不僅適用於.Net開發環境,其它語言也是一樣的,只要實現了需要的服務介面。並且該文不局限與OWA的研究,還包括Config、XML、Cache、Redis等技術。更重要的是熟悉.Net Co ...
  • 目錄索引 【無私分享:ASP.NET CORE 項目實戰】目錄索引 簡介 MyCat2.0版本很快就發佈了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amami ...
  • 1、本系統主要目的:1、實現電路圖線上設計及電路設備選型;2、對電路圖設計過程中涉及到的工程計算進行線上處理;3、對電路圖設計所涉及的相關數據可視化。 2、本系統實現前提:1、visio組件,傳統visio運用均是基於pc端本地visio軟體操作,無法滿足visio圖的實施共用性;2、web端是基於 ...
  • 本次介紹的是音樂播放器APlayer結合WebAPI的使用,先給各位看下效果: 上面就是APlayer的效果,然後這插件的地址是 https://github.com/DIYgod/APlayer 下麵是項目內容: APlayerAndWebApi是處理APlayer的,而WebAPI則是生成音樂列 ...
  • 我們來說一下Iqueryable集合和List等本地集合的區別,下麵我們通過建立一個簡單的例子來學習這個知識點,直接進入主題吧 1.首先對比一下兩段代碼?看一下有什麼結果: (1) 第一段代碼如圖所示: (2)第一段代碼使用資料庫的Profiler查看執行結果: (3)第二段代碼如圖所示: (4) ...
  • 材質顏色 OpenGL用材料對光的紅、綠、藍三原色的反射率來近似定義材料的顏色。象光源一樣,材料顏色也分成環境、漫反射和鏡面反射成分,它們決定了材料對環境光、漫反射光和鏡面反射光的反射程度。在進行光照計算時,材料對環境光的反射率與每個進入光源的環境光結合,對漫反射光的反射率與每個進入光源的漫反射光結 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...