QT6 学生管理系统以及登录(QSQLITE数据库)

news2024/11/20 13:45:30

一、准备工具以及环境

本文采用的是QT Creator6.5.3版本,代码基于C++语言,文中所用到的数据库是QSQLITE库。

因为做的是一个简单的学生管理系统,所以只是做到了简单的对数据库进行增删改查等操作,以及一个简单的登录界面。

二、UI界面以及结果展示

1、登录UI

所用到的控件分别是RadioButton、PushButton、Label、LineEdit等。

2、登录界面展示

为了使界面不单调,我在中间地方放了个Label标签,实现gif格式图片动画播放,这里可以省略,也可以用png图片代替。

RadioButton按钮区实现密码的隐藏与不隐藏控制。

3、管理界面UI

使用到的控件在图片中有,其中中间部分的数据显示,使用的是tableView控件。

4、管理界面展示

5、成果展示

三、实现过程

1、创建文件

1)

2)

3)

4)

5)

6)

最后点击下一步,点击完成,等待几秒即可完成创建。

2、添加sql

QT       += sql

3、头文件

主要实现连接数据库、操作数据库、以及简单的提示错误等。

登录界面使用到的头文件

#ifndef LOGIN_H
#define LOGIN_H

#include <QMainWindow>
#include <student.h>

#include <QLabel>
#include <QMovie>

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // LOGIN_H

管理界面使用的头文件

#ifndef STUDENT_H
#define STUDENT_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QsqlError>
#include <QsqlQueryModel>
#include <QDebug>
#include <QMessageBox>

namespace Ui {
class Student;
}

class Student : public QMainWindow
{
    Q_OBJECT

public:
    explicit Student(QWidget *parent = nullptr);
    ~Student();
private:
    Ui::Student *ui;
};

#endif // STUDENT_H

4、数据库的连接、数据库表的创建以及实现

void MainWindow::open_login_ui()  // 连接(打开)数据库
{
    this->login_ui = QSqlDatabase::addDatabase("QSQLITE");
    this->login_ui.setDatabaseName("login.db");
    if(!login_ui.open())
    {
        qDebug()<<"打开失败";
    }
    else
    {
        qDebug()<<"打开成功";
    }
}
void MainWindow::creat_login_ui() // 创建数据库表
{
    QSqlQuery query(login_ui);
    QString login = QString("create table login(""user int primary key not null,""password int not null)");
    if(!(query.exec(login)))
    {
        qDebug()<<"数据库表创建失败";
    }
    else
    {
        qDebug()<<"数据库表创建成功";
    }
}
void MainWindow::movie_show()  // 动画的实现 (也可以选择放置图片)
{
    this->movie = new QMovie(":/img/6.gif");
    ui->label_show->setMovie(movie);
    movie->setSpeed(65);
    movie->start();
}

四、对数据库操作

登录界面用到的槽函数

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QMovie *movie;
    QSqlDatabase login_ui;  // 账户密码管理

public slots:
    void movie_show();
    void open_login_ui();  // 打开数据库构造函数
    void creat_login_ui();  // 创建数据表构造函数
private slots:
    void on_pushButton_login_clicked();
    void on_pushButton_register_clicked();
    void on_radioButton_clicked();
};
#endif // LOGIN_H

管理界面用到的槽函数

namespace Ui {
class Student;
}

class Student : public QMainWindow
{
    Q_OBJECT

public:
    explicit Student(QWidget *parent = nullptr);
    ~Student();

private slots:
    void on_pushButton_insert_clicked();
    void on_pushButton_find_clicked();
    void on_pushButton_change_clicked();
    void on_pushButton_del_clicked();
    void on_pushButton_clear_clicked();

    void link_sql();  // 连接数据库
    void create_tab(); // 创建数据库表

private:
    Ui::Student *ui;

    QSqlDatabase db_student;
    QSqlQueryModel model;  // 储存结果集
};

1、增(添加)

void Student::on_pushButton_insert_clicked()  // 添加
{
    QSqlQuery query;
    int id = ui->lineEdit_id->text().toInt();
    if(id == 0)
    {
        QMessageBox::critical(this,"错误","学生的学号不能为0",QMessageBox::Ok);
        return ;
    }
    QString name = ui->lineEdit_name->text();
    if(name == "")
    {
        QMessageBox::critical(this,"错误","学生的姓名不能为空",QMessageBox::Ok);
        return ;
    }
    double score = ui->lineEdit_score->text().toDouble();
    if(score<0 || score >100)
    {
        QMessageBox::critical(this,"错误","学生的成绩不能小于0或者大于100",QMessageBox::Ok);
        return ;
    }

    QString list = QString("insert into student ""values(%1,'%2',%3)").arg(id).arg(name).arg(score);
    if(query.exec(list) == false)
    {
        QMessageBox::critical(this,"错误","数据插入失败!",QMessageBox::Ok);
        return ;
    }
    ui->label_show->clear();
    ui->label_show->setText("插入成功!");
}

2、删(删除)

void Student::on_pushButton_del_clicked() // 删除
{
    ui->label_show->clear();
    // 获取用户输入的姓名
    QString name = ui->lineEdit_name->text();

    // 检查姓名是否为空
    if (name.isEmpty()) {
        QMessageBox::warning(this, "Error", "Please enter a name to delete.");
        return;
    }

    // 执行删除操作
    QSqlQuery query;
    query.prepare("DELETE FROM student WHERE name = ?");
    query.addBindValue(name);
    if (!query.exec()) {
        QMessageBox::critical(this, "Error", "Failed to delete data: " + query.lastError().text());
        return;
    }

    // 确认删除
    //QMessageBox::information(this, "Success", "Data deleted successfully.");
    ui->label_show->setText("删除成功!");
}

3、改(修改)

void Student::on_pushButton_change_clicked()  // 修改
{
    // 获取用户输入
    QString id = ui->lineEdit_id->text();
    QString name = ui->lineEdit_name->text();
    QString score = ui->lineEdit_score->text();

    // 验证输入
    if (id.isEmpty() || name.isEmpty() || score.isEmpty()) {
        QMessageBox::warning(this, "错误", "输入不能为空");
        return;
    }

    bool scoreOk;
    int scoreInt = score.toInt(&scoreOk);
    if (!scoreOk || scoreInt < 0 || scoreInt > 100) {
        QMessageBox::warning(this, "错误", "分数无效,请输入0-10之间的数字");
        return;
    }

    // 执行更新操作
    QSqlQuery query;
    query.prepare("UPDATE student SET name = :name, score = :score WHERE id = :id");
    query.bindValue(":name", name);
    query.bindValue(":score", scoreInt);
    query.bindValue(":id", id);
    if (!query.exec()) {
        QMessageBox::critical(this, "Error", "Failed to update data: " + query.lastError().text());
        return;
    }

    ui->label_show->clear();
    ui->label_show->setText("修改成功!");
    // 确认更新
    // QMessageBox::information(this, "Success", "Data updated successfully.");
}

4、查(查阅)

void Student::on_pushButton_find_clicked() // 查询
{
    ui->label_show->clear();
    this->model.setQuery("SELECT * FROM student");
    ui->tableView->setModel(&model);
    ui->tableView->show();
    ui->label_show->setText("查询成功!");
}

5、清空输入框

void Student::on_pushButton_clear_clicked()  // 清空
{
    ui->label_show->clear();

    ui->lineEdit_id->clear();
    ui->lineEdit_name->clear();
    ui->lineEdit_score->clear();

    ui->label_show->setText("清空成功!");
}

五、总结

本文采用的是SQLITE数据库,在后续的改进中可以采用MySql数据库。

同时,后续改进的过程中,可以添加科目的选择与修改,分数的统计,计算平均分、排序、导出文件等操作,实现一个比较完善的学生管理系统。

当然了,还可以增添其他的模块,实现如住宿管理、课程(选课)管理等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1811229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wgcloud可以监测交换机的哪些数据

WGCLOUD可以监测交换机的cpu&#xff0c;内存&#xff0c;温度&#xff0c;电压&#xff0c;磁盘&#xff0c;流量传输速率等数据 WGCLOUD也是基于SNMP协议来监测交换机的

进口自力式蒸汽减压阀-美国品牌

进口自力式蒸汽减压阀是一种用于蒸汽系统中&#xff0c;通过自身能量来调节和控制蒸汽压力的装置。以下是关于进口自力式蒸汽减压阀的详细回答&#xff1a; 定义与功能&#xff1a; 进口自力式蒸汽减压阀是一种无需外加能源&#xff0c;利用被调介质&#xff08;蒸汽&#xff…

每日一题——Python实现PAT乙级1104 天长地久(举一反三+思想解读+逐步优化)七千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 点评 时间复杂度分析 空间复杂度分析 综合分析 我要更强 时间复杂度分…

VitePress+Docker+jenkins构建个人网站

VitePress官网 VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 可以理解为一个前端脚手架:快速生成个人站点 最好先大概看一遍 快速开始 | VitePress 可以在线体验一下 安装条件 node -v 检查下node版本 在D盘创建一个文件夹 例如:VitePress 进入文件夹 cmd npm ini…

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线

亚信安全联合鼎捷软件股份有限公司&#xff08;以下简称“鼎捷软件”&#xff09;正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家&#xff0c;围绕企业的数智安全状况&#xff0c;进行问题探索与治愈、新问题预测与预警&#xff0c;在全面筛查…

一文入门vim

先来波快问快答。 第一个问题&#xff0c;vim是什么&#xff1f; vim就是一文本编辑器。 第二个问题&#xff0c;我们为什么要使用vim&#xff1f; 好像在终端中可选择使用的文本编辑器也不多&#xff08;其他有&#xff0c;但是相对而言vim用的比较广泛&#xff09; 第三…

外汇天眼:跟单社区or资金盘 几招教你快速识别

今年有不少外汇跟单社区伙同黑平台收割投资人跑路事件&#xff0c;应天眼老粉要求&#xff0c;今天写一篇与跟单社区相关的内容&#xff0c;教大家如何辨别正规的外汇跟单社区与资金盘诈骗。 相信做过几年外汇的人&#xff0c;应该对跟单社区多少有所耳闻。但外汇跟单社区究竟…

使用seq2seq架构实现英译法

seq2seq介绍 模型架构&#xff1a; Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种在自然语言处理&#xff08;NLP&#xff09;中广泛应用的架构&#xff0c;其核心思想是将一个序列作为输入&#xff0c;并输出另一个序列。这种模型特别适用于机器翻译、聊天…

文件IOoooo

1.1 文件路径 文件路径分为两种&#xff1a; 1、绝对路径&#xff1a;以C:、D:等盘符开头的&#xff0c;就是我们所说的绝对路径&#xff0c;根据它可以直接找到文件的具体位置。 2、相对路径&#xff1a;需要先指定一个目录作为基准目录&#xff0c;从基准目录出发&#xf…

【PowerDesigner】CDM生成PDM

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. CDM生成PDM ​​​​​​​&#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用Pow…

肾合的秘密:长期出汗,身体在告诉你什么?

想象一下&#xff0c;我们的身体是一座繁茂的秘密花园&#xff0c;每一寸肌肤、每一个细胞都是花园里的一朵花、一片叶。汗水&#xff0c;则是这花园中无声的语言&#xff0c;它讲述着我们的健康与否&#xff0c;也揭示着身体内部的微妙变化。 在夏日阳光下&#xff0c;我们的身…

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后&#xff0c;我们对迭代器的印象也是加深了许多&#xff0c;但是我们实现的都是正向迭代器&#xff0c;还没有实现反向迭代器&#xff0c;那么为什么迟迟不实现呢&#xff1f;因为难吗&#xff1f;实际上还好。…

如何轻松解决自养号测评中的买家签收问题?

在当今日益繁荣的跨境电商领域&#xff0c;自养号测评已成为众多卖家提升销量与排名的关键策略。然而&#xff0c;在这条道路上&#xff0c;买家签收难题却像是一座难以逾越的山峰&#xff0c;让不少卖家感到困扰。本文将深入探讨如何巧妙攻克这一难题&#xff0c;为自养号测评…

Redis 持久化存储

一、简介 1、RDB redis默认的持久化存储方式&#xff0c;每隔一段时间将内存中的数据写入磁盘中。有手动触发和自动出发两种触发方式。 2、AOF AOF持久化将被执行的写命令记录到AOF文件的末尾&#xff0c;来记录数据发生的变化。Redis启动时&#xff0c;读取AOF文件中的命令并…

北航数据结构与程序设计第五次作业选填题复习

选填题考的很多都是基础概念&#xff0c;对于巩固复习一些仡佬拐角的知识点是很有用的。非北航学生也可以来看看这些题&#xff0c;这一节主要是树方面的习题&#xff1a; 一、 我们首先需要知道一个公式 这是证明&#xff1a; 知道了这个公式&#xff0c;我们把题目中的数据…

Java面试八股之构造方法有哪些特性

构造方法有哪些特性 方法名与类名相同&#xff1a;构造方法的名称必须与它所在的类名称完全相同&#xff0c;包括大小写。 无返回类型&#xff1a;构造方法没有返回类型声明&#xff0c;连void也不需要。虽然没有明确的返回类型&#xff0c;但它隐式地返回了新创建的实例的引…

日本麻将基本规则和基本术语以及役种讲解

基本规则 无役无法和牌 “役”是特定牌的组合&#xff0c;不满足任何役是无法和牌的,关于役在后面会进行深入的讲解 和牌条件 满足和牌牌型有役荣和时不能振听 和牌牌型 ABC*xAAA*yDD,一般的和牌牌型,x组顺子和y组刻子加上一组对子(xy4)AA*7,特殊的和牌牌型,是一种役,名叫…

电线电缆单根燃烧试验 电缆垂直燃烧试验

电线电缆单根燃烧试验 电线电缆单根燃烧试验是一种用来评估电线电缆在受到火焰作用时的燃烧性能的测试方法。这种试验通常是将电线电缆垂直固定&#xff0c;然后使用特定的火焰源对其进行燃烧&#xff0c;以观察电线电缆的燃烧行为和燃烧速度。通过这个试验&#xff0c;可以评估…

阿一网络安全学院来向你科普关于企业安全服务

一、四大服务体系 1、可管理安全服务 在提供传统安全产品及安全服务的基础上&#xff0c;逐步开展安全运营&#xff0c;用开放的安全平台连接卓越的产品和服务&#xff0c;洞察安全态势&#xff0c;为企业级用户提供小时级的闭环安全保障。 2、安全咨询服务 为客户进行全方…

postman教程-19-mock测试

上一小节我们学习了Postman接口参数化方法&#xff0c;本小节我们讲解一下Postman mock测试的方法。 一、什么叫mock测试 mock测试就是在测试过程中&#xff0c;对某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便于测试的一种测试方法&#xff0c…