Qt-实现简单的学生信息管理_初识QT
2018-06-17 23:50:06来源:未知 阅读 ()
项目介绍:利用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库中所有类,和使用方法。等
总结:这次的项目实训,收获颇多,但也有许多不足,写代码的时候错误百出,但是也正是在找错,改错的过程中,学到了许多东西,也让我见识到了编程语言的强大型,以前总感觉学这些语言太过于抽象,不知道用它来做什么,经过这些小的训练,才发现语言的奥妙,我相信我会在这条路上越走越远。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++冒泡排序 (基于函数模板实现) 2020-05-31
- opencv-12-高斯滤波-双边滤波(附C++代码实现) 2020-05-10
- 二叉排序树 2020-05-02
- 抽象宠物类的实现 代码参考 2020-04-29
- 虚函数实现多态性 代码参考 2020-04-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash