学生信息管理系统

一个简单的学生信息管理系统

主要步骤:

一、添加学生对话框的设计

1.建窗口

(1)布局各个控件,并更改名称,应当注意的是当布局中的label占据较大位置影响整体布局的时候,考虑对layout进行垂直策略的fixed.
学生信息管理系统_第1张图片

2.添加学生对话框代码的编写

(1)首先对确定按键进行转到槽操作,获取姓名和学号两个输入框的信息。

学生信息管理系统_第2张图片
使用qDebug操作需要引用头文件**#include **

(2)要写输入的信息再出现一个对话框显示确认,需要调用一个新的头文件#include 查找help手册的Detailed Descripation内容。这是选择系统已经编辑好的带代码进行修改,会发现“请确认学生信息”这里会报错,这是QtCreator本身的bug,这里可以对文本编辑进行修改,工具->选项->文本编辑器->行为:

在这里插入图片描述
设置好之后重新输如信息,将不会报错,但是会出现乱码的情况。
解决办法:
在cpp文件中加入#pragma execution_character_set(“utf-8”)
原文:https://blog.csdn.net/passer_by_hq/article/details/51283066

学生信息管理系统_第3张图片
新弹出的确认框会的button名称是英文的,这里需要改成中文应该怎么操作:
学生信息管理系统_第4张图片
查阅help文档,这里自己添加Button函数:

msgBox.addButton("确定",QMessageBox::AcceptRole);     //自定义按键将默认的英文名称改为中文
msgBox.addButton("取消",QMessageBox::RejectRole);

自定义需要默认的按钮,加入函数,须引入头文件#incluce

QPushButton * oBtn = msgBox.addButton("确定",QMessageBox::AcceptRole);   //自定义默认按键

以上的代码比较麻烦,可以使用QT自带QMessageBox的static public members 编写函数:this是继承父类

QString content = name + '\n' + id;
int ret =  QMessageBox::information(this,"请确认信息",content,"确认","取消"); 
// 几个函数的区别在于图标的不同,warnig,critical等

学生信息管理系统_第5张图片

(3)对输入框进行编辑
  1. QLineEdit->echoMode可以设置不同的输入格式;
    ->placeholderText书写提示字符;
    ->clearbuttonEnable 添加清除符号;

  2. 查看help手册Qline中 signals 可以编辑账号框的信息

 QString content = name + '\n' + id;
    if(name.length()<1 || id.length() < 10){
        QMessageBox::critical(this,"错误","请输入完整信息","确定");
    }else{
        int ret =  QMessageBox::question(this,"请确认信息",content,"确认","取消");  // 几个函数的区别在于图标的不同,warnig,critical等
    }
  1. 设置年龄/院系信息:直接双击下拉框添加;
  2. 对性别/兴趣的多选部分如下;

4.1 用CTRL选中rbtn_fmale和rbtn_male,右击弹出
菜单,选择“指定到按钮组”->“新建按钮组”。
4.2.然后在Qt右上部分这个“对象 类”的表格里翻到最后,会找到“buttonGroup”,这就是刚刚新建的按钮组。
4.3.请选中buttonGroup,在QObject中修改objectName的值为"sexGroup"。
4.4.同样的方法,把“兴趣”中的四个复选框checkBox,checkBox_2,checkBox_3,checkBox_4加入到新建按钮组"insGroup"
4.5.把"insGroup"属性QButtonGroup中的"exclusive"后面的钩去掉,也就是使之处于没有被勾选的状态。这一步是为了让兴趣的四个选项能够被多选。exclusive是"排他"之意。
4.6.addstu.cpp开头可能还缺少一些对头文件的引用,增加:
#include
#include
#include

这里是2和3的代码实现

 QString sex= this->ui->sexGroup->checkedButton()->text();  //性别

    QList<QAbstractButton *> ins_list = this->ui->insGroup->buttons();  //兴趣
    QString ins;
    int i = 0;
    for (i = 0; i<ins_list.length(); i++){
        QAbstractButton * che = ins_list.at(i);
        if(che->isChecked()){
            ins += che->text() + ",";
        }
    }
QString age = this->ui->cbb_age->currentText();  //年龄
QString dev = this->ui->cbb_dep->currentText();  //院系


//窗口显示信息
QString content = name + '\n' + id +'\n' + sex + '\n' + dev + '\n' + ins; 
  1. 添加信息的界面还原

首先在头文件public中再写一个函数:void clearUserInterface ;

//还原用户页面的状态
void addStu::clearUserInterface()
{
    this->ui->le_name->clear();
    this->ui->le_id->clear();
    this->ui->rBtn_male->setChecked(true);    //默认指向男性
    this->ui->cbb_age->setCurrentIndex(0);    //默认指向第一个元素
    this->ui->cbb_dep->setCurrentIndex(0);    //默认指向第一个元素
    QList<QAbstractButton *> ins_list = this->ui->insGroup->buttons();   //兴趣列表
    int i = 0;
    for (i = 0;i < ins_list.length(); i++)
    {
        QAbstractButton * box = ins_list.at(i);  //是容器
        box->setChecked(false);
    }
    this->ui->le_name->setFocus();
}

同时在确认按键中也要调用该函数:

int ret =  QMessageBox::question(this,"请确认信息",content,"确认","取消");
        // 几个函数的区别在于图标的不同,warnig,critical等
        if(ret ==0){
            clearUserInterface();   //调用下面的用户清理函数
        }
  1. 保存输入的学生信息

查看help手册Detailed Description,写入文件
1.首先包含三个头文件:
#include
#include
#include
6. 代码部分:

void addStu::writeToFile(QString cnt)
{
    QFile file("stu.txt");
    if(! file.open(QIODevice::Append | QIODevice::Text)) 
    //读入信息Appendde是累加显示,不对前面的信息有影响
    {
        QMessageBox::critical(this,"错误","文件打开失败,信息没有保存!","确定");   //提示用户
        return;
    }
    QTextStream out(&file);
    out << cnt;
    file.close();
}
QString cnt = name + " " + id + " " + sex + " " + dev + " " + ins + "\n"; //把所有读取的信息显示在一行存储

writeToFile(cnt);

二、主窗口的设计

  1. .pro中新建QT设计师界面类选择MainWindow;

  2. main函数中加入头文件,并默认优先打开mainwindow;

  3. 给主窗口添加下拉菜单,如图所示:
    在这里插入图片描述

  4. 对菜单栏进行添加槽函数:
    学生信息管理系统_第6张图片
    mainwindow.cpp添加头文件#include

void MainWindow::on_actionaddStu_triggered()
{
    static addStu a;
    //a.exec();  //会阻塞程序,主窗口关不掉(模态视图)
    a.show();
}

三、查询窗口的设计

  1. 和第一个添加学生信息窗口相类似,设计一个Dialog对话框,插入table view控件,并对文件进行存储当我们点击query时执行操作。代码实现如下:
    query.h
#ifndef QUERY_H
#define QUERY_H

#include 
#include 
#include 
#include 

namespace Ui {
class query;
}

class query : public QDialog
{
    Q_OBJECT

public:
    explicit query(QWidget *parent = 0);
    ~query();
    int readFromFile();

private:
    Ui::query *ui;
    QList<QString> stu_lines;
};

#endif // QUERY_H

query.cpp

#include "query.h"
#include "ui_query.h"
#include 
#include 

query::query(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::query)
{
    ui->setupUi(this);
    //在构造函数里调用了readFromFile文件,并返回值
    if(readFromFile()==-1){                                          
        QMessageBox::critical(this,"错误","文件打开失败,请重试!");
        this->close();
    }

}

query::~query()
{
    delete ui;
}

int query::readFromFile()
{
    QFile file("stu.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return -1;
    }
    QTextStream in(&file);

    while(!in.atEnd()){
        QString line = in.readLine();
        stu_lines.append(line);
    }
    file.close();
    return 0;

}

  1. 搜索过程的实现
    获取用户的查询方式以及查询内容

query.h

public:
    explicit query(QWidget *parent = 0);
    ~query();
    int readFromFile();
    void doQuery(int index, QString cnt);  //函数的查询
    void disPlay(int row,QStringList subs);

query.cpp

void query::on_btn_search_clicked()
{
    int index = this->ui->cbb_method->currentIndex();
    QString cnt = this->ui->le_cnt->text();
    doQuery(index,cnt);   //调用查询函数
}

void query::doQuery(int index, QString cnt)
{
    int row = 0;   //显示第几行
    for (int i = 0; i<stu_lines.length(); i++){
        QString line = stu_lines.at(i);
        line = line.trimmed();
        QStringList subs = line.split(" ");   //分割
        switch (index) {
        case 1:
            if(cnt == subs.at(0)){
                disPlay(row++,subs);
            }
            break;
        case 2:
            if(cnt == subs.at(1)){
                disPlay(row++,subs);
            }
            break;
        case 3:
            if(cnt == subs.at(2)){
                disPlay(row++,subs);
            }
        case 4:
            if(cnt == subs.at(3)){
                disPlay(row++,subs);
            }
            break;
        case 5:
            if(cnt == subs.at(4)){
                disPlay(row++,subs);
            }
            break;
        default:
            break;
        }
    }
}

void query::disPlay(int row, QStringList subs)
{
    int i = 0;
    for(i = 0; i<5;i++){
        this->model->setItem(row,i,new QStandardItem(subs.at(i)));
    }
    //合并兴趣单元格
   QString ins;
   for(i = 5; i<subs.length(); i++){
      ins += subs.at(i)+",";
   }
   this->model->setItem(row,5,new QStandardItem(ins));
}

到此结束

你可能感兴趣的:(QT)