使用Qt5编写一个学生管理系统

程序使用Qt5编写了一个学生管理系统

首先介绍一下项目框架,项目包含一个主窗口mainwindow

Mainwindow使用的就是最常见的Mainwindow带对话框的,带标题栏等等的窗口
在这里插入图片描述
两个子窗口(一个学生信息录入界面,一个学生信息查询界面),这两个窗口都是dialog without buttons的dialog窗口
在这里插入图片描述
在这里插入图片描述
下面截图是程序pro的框架,类Mianwindow是主窗口,类dialog是录入信息窗口,类query是查询窗口。
在这里插入图片描述

小程序使用到的主要控件:
  1. Qlabel
  2. QLineEdit
  3. QRadioButton
  4. QComboBox
  5. QCheckBox
  6. QPushButton
  7. QTable View(这个稍微复杂一点,其余都很基础)
附上我写基本过程和这个小程序源码

首先我先写的录入学生信息界面,ui源码量太大,我就不写了,需要的可以给我发邮件zhangyin.29@163.com
下面贴上 dialog.h源码

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QString>
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    void clear_interface();
    void writetofile(QString cnt);
private slots:
    void on_btn_ok_clicked();

    void on_btn_cancel_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

下面贴上dialog.cpp源码

#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
#include <QList>
#include <QAbstractButton>
#include <QCheckBox>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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

void Dialog::on_btn_ok_clicked()
{
    QString name = this->ui->le_name->text();
    QString id = this->ui->le_id->text();
    QString sex = this->ui->sexGroup->checkedButton()->text();
    QString age = this->ui->cbb_age->currentText();
    QString faculty=this->ui->cbb_collage->currentText();
    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 content;
    content = name+'\n'+id+'\n'+age+'\n'+sex+'\n'+faculty+'\n'+ins;
    QString cnt;
    cnt = name+" "+id+" "+age+" "+sex+" "+faculty+" "+ins+'\n';
    if (name.length()<1 ||id.length()<8){
        QMessageBox::critical(this,"错误","信息填写不完整","确定");
    }
    else{
        int ret = QMessageBox::question(this,"please confirm information",content,"确定","取消");
        if (ret == 0){
            clear_interface();
            writetofile(cnt);
        }
    }
//    msgBox.setText("请确认信息.");
//    msgBox.setInformativeText(name +'\n'+ id );
//    //msgBox.setStandardButtons(QMessageBox::Save| QMessageBox::Discard | QMessageBox::Cancel);
//    //msgBox.setDefaultButton(QMessageBox::Save);
//    msgBox.addButton("确定", QMessageBox::AcceptRole);
//    msgBox.addButton("取消", QMessageBox::RejectRole);
//    int ret = msgBox.exec();

}

void Dialog::clear_interface()
{
    this->ui->le_name->clear();
    this->ui->le_id->clear();
    this->ui->radioButton_man->setChecked(true);
    this->ui->cbb_age->setCurrentIndex(0);
    this->ui->cbb_collage->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);
    }
}

void Dialog::writetofile(QString cnt)
{
    QFile file("stu.txt");
    if(! file.open(QIODevice::Append | QIODevice::Text)){
        QMessageBox::critical(this,"错误","文件打开失败","确认");
        return;
    }
    QTextStream out(&file);
    out<<cnt;
    file.close();

}

void Dialog::on_btn_cancel_clicked()
{
    this->close();
}
然后我写的是主界面,这个很简单,拖几个控件就可以

下面是mainwindow.h文件源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_actionaddStu_triggered();

    void on_actionqueryStu_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

下面是mianwindow.cpp源码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "query.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_actionaddStu_triggered()
{
    Dialog a;
//    a.show();
    a.exec();
}

void MainWindow::on_actionqueryStu_triggered()
{
    Query b;
    b.exec();
}
最后是查询界面源码,query源码,首先是query.h
#ifndef QUERY_H
#define QUERY_H

#include <QDialog>
#include <QFile>
#include <QList>
#include <QString>
#include <QStandardItem>
#include <QStandardItemModel>
namespace Ui {
class Query;
}

class Query : public QDialog
{
    Q_OBJECT

public:
    explicit Query(QWidget *parent = 0);
    ~Query();
    int readFromFile();
    void doquery(int index,QString cnt);
    void display(int row,QStringList subs);
private slots:
    void on_btn_search_clicked();

private:
    Ui::Query *ui;
    QList<QString> stu_lines;
    QStandardItemModel *model;
};

#endif // QUERY_H

接下来是Query.cpp源码

#include "query.h"
#include "ui_query.h"
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>

Query::Query(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Query)
{
    ui->setupUi(this);
    if (readFromFile() == -1){
        QMessageBox::warning(this,"严重错误","文件打开失败");
        this->close();
    }
    this->model = new QStandardItemModel;
    //设置表头


    this->ui->tableView->setModel(model);

}

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

int Query::readFromFile()
{
    QFile file("stu.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
//        QMessageBox::critical(this,"错误","文件读取失败","确认");
        return -1;
    }

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

void Query::on_btn_search_clicked()
{
    this->model->clear();

    this->model->setHorizontalHeaderItem(0,new QStandardItem("姓名"));
    this->model->setHorizontalHeaderItem(1,new QStandardItem("学号"));
    this->model->setHorizontalHeaderItem(2,new QStandardItem("性别"));
    this->model->setHorizontalHeaderItem(3,new QStandardItem("年龄"));
    this->model->setHorizontalHeaderItem(4,new QStandardItem("院系"));
    this->model->setHorizontalHeaderItem(5,new QStandardItem("兴趣"));
    this->ui->tableView->setColumnWidth(0,50);
    this->ui->tableView->setColumnWidth(1,200);
    this->ui->tableView->setColumnWidth(2,50);
    this->ui->tableView->setColumnWidth(3,50);
    this->ui->tableView->setColumnWidth(4,100);
    this->ui->tableView->setColumnWidth(5,300);

    int index = this->ui->cbb->currentIndex();
    QString cnt = this->ui->le_cnt->text();
    doquery(index,cnt);
}

void Query::doquery(int index, QString cnt)
{
    int i = 0;
    int row = 0;
    for (i=0;i<stu_lines.length();i++){
        QString line = stu_lines.at(i);
        line = line.trimmed();
        QStringList list = line.split(" ");
        switch (index) {
        case 1:
            if (cnt == list.at(0)){
                display(row++,list);
            }
            break;
        case 2:
            if (cnt == list.at(1)){
                display(row++,list);
            }
            break;
         case 3:
            if (cnt == list.at(4)){
                display(row++,list);
            }
            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(int i=5;i<subs.length();i++){
        ins+=subs.at(i)+" ";
    }
    this->model->setItem(row,5,new QStandardItem(ins));
}
最后是main函数.cpp源码
#include "dialog.h"
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
程序稍微需要一些新知识的有两个方面
  1. Qt的容器相关概念,这个可以看帮助文档
    这里把这个项目用的容器在这里说明一下:
    QList是一个容器类,<QAbstractButton *>代表的是容器类里面存储元素的类型,然后ins_list代表的是,我理解为列表名称,然后就是通过Qt中的at方法读取第几个列表元素,然后进行拼接字符串操作。
    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()+" ";
        }

后面在查询的时候也使用了一次容器类
QList<QString> stu_lines;
这个是在query.h中的privite的私有变量中定义的。
然后在query.cpp里可以直接用了
while (!in.atEnd()) { QString line = in.readLine(); this->stu_lines.append(line); }
2 .控件中的table view使用:
table view是基于MVC框架设计的。
表格中一个小格属于QStandardItem类
一个整个表格属于QStandardItemModel
我们在.h文件中定义一个privite变量QStandardItemModel *model
然后在构造函数中实例化一个变量
this->model = new QStandardItemModel;
有了这个model指针对象后,就可以使用model的一些内容函数;
如设置表头setHorizontalHeaderItem(int 列,内容)

this->model->setHorizontalHeaderItem(0,new QStandardItem("姓名"));
    this->model->setHorizontalHeaderItem(1,new QStandardItem("学号"));
    this->model->setHorizontalHeaderItem(2,new QStandardItem("性别"));
    this->model->setHorizontalHeaderItem(3,new QStandardItem("年龄"));
    this->model->setHorizontalHeaderItem(4,new QStandardItem("院系"));
    this->model->setHorizontalHeaderItem(5,new QStandardItem("兴趣"));

管理外观的,使用table view自己的函数

this->ui->tableView->setColumnWidth(0,50);
    this->ui->tableView->setColumnWidth(1,200);
    this->ui->tableView->setColumnWidth(2,50);
    this->ui->tableView->setColumnWidth(3,50);
    this->ui->tableView->setColumnWidth(4,100);
    this->ui->tableView->setColumnWidth(5,300);

最后在把管理内容的model,显示在table view中

this->ui->tableView->setModel(model)this->ui->tableView->setModel(model)```

这就是典型的MVC思想。与上一篇博客中计算器使用类似
大家有问题可以相互交流,共同进步,本人就是编程小白一个。
我的邮箱是 zhangyin.29@163.com

  • 17
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 63
    评论
### 回答1: 学生管理系统一个用于管理学生信息的程序,可以实现学生信息的增加、删除、修改和查询等功能。下面是我使用Qt编写学生管理系统的程序的一些建议: 首先,我会创建一个主窗口,通过菜单栏和工具栏等组件来实现对学生信息管理的各项操作。在主窗口中,我会添加一个表格控件用于展示学生信息,每一行表示一个学生,每一列表示一个学生属性。 接着,我会创建一个学生类,用于存储每个学生的信息,包括学号、姓名、年龄、性别等。我会在程序启动时初始化一个学生列表,用于存储所有的学生对象。 在主窗口的功能实现方面,我会添加一个“添加学生”按钮,点击后弹出一个对话框,用户可以输入新学生的信息。我会在对话框中添加相应的输入框和下拉框,用于输入学生各项属性的值。点击确认按钮后,将新学生的信息添加到学生列表中,并刷新表格展示。 此外,我会添加一个“删除学生”按钮和一个“修改学生”按钮,用于删除和修改选中的学生信息。用户可以在表格中选中一行学生信息,点击对应的按钮后弹出对话框,允许用户修改或删除学生的各项属性。确认修改后,更新学生列表和表格展示。 最后,我会添加一个“查询学生”功能,用户可以输入一个关键字进行模糊查询,找到符合条件的学生信息并展示在表格中。用户可以根据需要选择不同的查询方式,如按学号、姓名、年龄等进行查询。 综上所述,使用Qt编写学生管理系统的程序主要包括创建主窗口、学生类和学生列表、实现添加、删除、修改和查询学生信息的功能。这样的程序可以方便高效地管理学生信息,提高学校或教育机构的管理效率。 ### 回答2: 学生管理系统一个方便学校或教育机构管理学生信息的程序。Qt一个跨平台的图形用户界面(GUI)开发工具,可以用来编写学生管理系统的程序。 首先,我们可以使用Qt的部件来设计一个用户友好的界面。主界面包括学生信息的输入框和按钮,例如姓名、年龄、性别等。用户可以通过界面添加、删除和修改学生信息,并可以进行搜索和排序。 接下来,我们可以使用Qt提供的数据库支持来创建学生的数据库。可以使用SQLite等数据库引擎来存储学生信息。通过Qt的数据库模块,可以方便地连接数据库、执行SQL查询和更新操作。 对于学生管理系统,可以有一些基本功能,如添加学生、删除学生、修改学生信息和查看学生信息。通过与数据库的交互,用户可以方便地进行这些操作。 除了基本的学生信息管理功能,还可以为学生管理系统增加其他功能,如成绩管理、课程管理等。可以为每个学生添加成绩,并可以根据学生的成绩进行统计和分析。 此外,还可以为学生管理系统添加用户权限管理功能,例如管理员和教师可以对学生信息进行修改和删除,而学生只能查看自己的信息。 总之,使用Qt编写一个学生管理系统的程序可以让学校或教育机构更方便地管理学生信息,并提供了很多其他功能以供教学和统计分析使用使用Qt可以简化界面设计和数据库操作,并提供了跨平台的支持,可以在不同的操作系统上运行。
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值