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行开始写

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

总结:这次的项目实训,收获颇多,但也有许多不足,写代码的时候错误百出,但是也正是在找错,改错的过程中,学到了许多东西,也让我见识到了编程语言的强大型,以前总感觉学这些语言太过于抽象,不知道用它来做什么,经过这些小的训练,才发现语言的奥妙,我相信我会在这条路上越走越远。

时间: 2024-07-30 20:17:33

Qt-实现简单的学生信息管理_初识QT的相关文章

Laravel之简单的学生信息管理平台

laravel框架写的简易版的学生信息管理平台,贯穿了laravel的控制器.视图.模板.模型.中间件.路由规则的使用. 页面是使用BootStrap前端框架搭建 使用laravel实现了增删改查的功能. //这是路由文件的关键代码 Route::group(['middleware' => ['web']], function () { Route::get('student/index',['uses'=>'[email protected]']); Route::any('student

学生信息管理(mvc模式)

简单的学生信息管理: student类封装属性,一个构造方法 package com.hanqi.dao; import java.util.Date; //映射student表的实体类 //类名映射表名 public class Student { //属性名映射字段名 private String sno; private String sname; private String ssex; private Date sbirthday; private String sclass; pub

实践hibernate的应用——struts2+hibernate的简单学生信息管理

struts2+hibernate的简单学生信息管理,没有用很好的界面,目的主要是为了实践一下hibernate框架的学习,深入了解hibernate框架. 下面是项目的目录: 配置文件hibernate.cfg.xml <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&

vue实现简单学生信息管理案例

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生信息管理</title> <link rel="stylesheet" href="./lib/bootstrap.css"> <script src="./lib/vue.js&quo

Ubuntu下wxWidgets学生信息管理sqlite3(C++)

main.cxx #include <sqlite3.h> #include <cstdlib> #include <iostream> #include <iomanip> using namespace std; int main() { sqlite3* file; int flag; flag = sqlite3_open("./stu.db", &file); if(SQLITE_OK != flag) { cout&l

Ubuntu下wxWidgets学生信息管理soci

main.cxx #include "soci.h" #include "soci-sqlite3.h" using namespace soci; #include <iostream> using namespace std; int main() { session sql; sql.open(sqlite3, "./stu.db"); /*method1*/ /*rowset<row> rs = (sql.prep

【mfc】学生信息管理,实现List控件节点的增删改查

之前在mfc这个专栏里面,写了很多关于win32的程序, 其实也没什么的,win32是mfc的基础, mfc只是win32的扩展,系统自带的扩展,新建一个mfc如同新建一个win32程序,不过这个win32程序一开始就带了很多空函数框架. 一.基本目标 要建立如下图所示的学生信息管理mfc程序,当然这个程序以后应该考虑连接数据库,access,sql server都可以, 同时连同<[mfc]用对话框分页实现用户登录>(点击打开链接),让用户登录之后才能够管理信息,当然这是后话. 1.这个程序

Ubuntu下wxWidgets学生信息管理sqlite3

简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method)模式. 简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类. 有4个角色 工厂类角色:是具体产品类角色直接调用者. 抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互. 具体产品角色:被工厂类创建的对象,也是客户端实际操作对象. 客户端:调用工厂类产生实例,并调用实例的方法进行相应工作. c++实现 #include <iostream> #

ibatis之——学生信息管理实例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47107647 iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了. 官网为:http://www.mybatis.org/ 搭建iBatis 开发