淘先锋技术网

首页 1 2 3 4 5 6 7

程序使用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源码量太大,我就不写了,需要的可以给我发邮件[email protected]
下面贴上 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思想。与上一篇博客中计算器使用类似
大家有问题可以相互交流,共同进步,本人就是编程小白一个。
我的邮箱是
[email protected]