10.11作业

实现简单数据库功能 (增删改查)

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QSqlDatabase> //  数据库管理类
#include <QWidget>      //
#include <QSqlQuery>
#include <QSqlRecord>       //记录类
#include <QTableWidgetItem>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void setupConnections();
private slots:
    void on_addBtn_clicked();

    void on_showBtn_clicked();

    void on_deleteBtn_clicked();

    void on_sortBtn_clicked();

    void on_msgTable_itemChanged(QTableWidgetItem *item);

private:
    Ui::Widget *ui;

    //实例化一个数据库对象
    QSqlDatabase db;
    //添加一个用来指示是否在更新数据。
    bool isUpdating = false;
};
#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //想要添加某个数据库
    if(!db.contains("stu.db")){
        //如果当前对象中没有包含所需的数据库,则添加一个数据库
        db = QSqlDatabase::addDatabase("QSQLITE"); //添加一个sqlite3的数据库
        db.setDatabaseName("stu.db");           //设置数据库的名称
    }
    //打开数据库
    if(!db.open()){
        QMessageBox::information(this,"提示","数据库打开失败");
        return ;
    }
    //实例化一个sql语句执行者
    QSqlQuery querry;
    QString sql = "create table if not exists STU(id int,name char,sex char,score double)";
    if(!querry.exec(sql)){
        QMessageBox::information(this,"提示","数据库创建表失败");
        return;
    }
    //修改操作会自动触发该连接
    setupConnections();
}

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


//添加
void Widget::on_addBtn_clicked()
{
    //1.获取ui界面上的相关信息
    int ui_num = ui->numEdit->text().toUInt();      //获取学号
    QString ui_name = ui->nameEdit->text();         //姓名
    QString ui_sex = ui->sexEdit->text();           //性别
    double ui_score = ui->scoreEdit->text().toDouble();//分数
    //2.判断信息是否为空
    if(ui_num == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0){
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }
    //3.准备sql语句
    QString sql = QString("insert into STU(id,name,sex,score) values(%1,'%2','%3',%4);")
            .arg(ui_num).arg(ui_name).arg(ui_sex).arg(ui_score);

    qDebug()<<sql;
    //4.实例化sql执行者
    QSqlQuery querry;
    //5.执行Sql语句
    if(!querry.exec(sql)){
        QMessageBox::information(this,"提示","添加信息失败");
    }
    else{
        QMessageBox::information(this,"提示","添加成功");
        ui->numEdit->clear();
        ui->nameEdit->clear();
        ui->sexEdit->clear();
        ui->scoreEdit->clear();
    }
}
//展示
void Widget::on_showBtn_clicked()
{

    isUpdating = true;  // 开始查询,避免触发itemChanged
    //1.实例化一个sql语句执行者
    QSqlQuery querry;
    //2.准备sql语句
    QString sql = "select * from STU;";
    //3.执行Sql语句
    if(!querry.exec(sql)){
        QMessageBox::information(this,"提示","查询失败");
        return ;
    }
    //程序执行至此,表示已经完成数据库的查询,并将结果存放到querry对象中
    //清空之前的表格内容
    ui->msgTable->clear();

    //设置表头
    ui->msgTable->setHorizontalHeaderLabels(QStringList() << "学号" << "姓名" << "性别" << "分数");
    //可以通过next函数进行遍历每个结果集
    qDebug()<<"查询数据库信息:";
    int i = 0;
    while(querry.next()){
        //获取当前记录
        QSqlRecord record = querry.record();
        //对当前记录进行操作,遍历当前记录的所有字段
        for(int j=0;j<record.count();j++){
            qDebug() <<record.value(j).toString();
            //该循环中的value(j),表示的就是第i行j列的元素
            QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());
            //QString m = record.value(j).toString();
            ui->msgTable->setItem(i,j,item);
        }
        i++;
    }
    isUpdating = false;  // 恢复状态
}
//删除后在msgTab上显示
void Widget::on_deleteBtn_clicked()
{
    //1.获取ui界面上的相关信息
    int ui_num = ui->numEdit->text().toUInt();      //获取学号
    QString ui_name = ui->nameEdit->text();         //姓名
    QString ui_sex = ui->sexEdit->text();           //性别
    double ui_score = ui->scoreEdit->text().toDouble();//分数
    if(ui_num == 0 && ui_name.isEmpty() && ui_sex.isEmpty() && ui_score == 0){
        QMessageBox::information(this,"提示","请填写信息来删除");
        return;
    }
    QSqlQuery querry;
    QString sql = QString("delete from STU where "
                  "id = %1 or name = '%2' or sex = '%3' or score = %4;")
            .arg(ui_num).arg(ui_name).arg(ui_sex).arg(ui_score);
    if(!querry.exec(sql)){
        QMessageBox::information(this,"提示","删除失败");
        return ;
    }
    Widget::on_showBtn_clicked();

}
//排序 升序 后在msgTab上显示
void Widget::on_sortBtn_clicked()
{
    isUpdating = true;  // 开始查询,避免触发itemChanged
    // 1. 实例化一个SQL语句执行者
        QSqlQuery querry;
        // 2. 准备SQL语句,按ID升序排序
        QString sql = "select * from STU order by score ASC;";

        // 3. 执行SQL语句
        if(!querry.exec(sql)){
            QMessageBox::information(this,"提示","查询失败");
            return ;
        }

        // 4. 清空之前的表格内容
        ui->msgTable->clear();

        // 5. 设置表头
        ui->msgTable->setHorizontalHeaderLabels(QStringList() << "学号" << "姓名" << "性别" << "分数");

        // 6. 读取并显示查询结果
        int i = 0;
        while(querry.next()){
            QSqlRecord record = querry.record();
            for(int j=0; j<record.count(); j++){
                QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());
                ui->msgTable->setItem(i, j, item);
            }
            i++;
        }
        isUpdating = false;  // 恢复状态
}


void Widget::on_msgTable_itemChanged(QTableWidgetItem *item)
{
    if (isUpdating) return;  // 如果在查询中,直接返回
    // 获取被修改的行和列
    int row = item->row();
    int column = item->column();

    // 获取学号作为唯一标识
    int id = ui->msgTable->item(row, 0)->text().toInt();

    // 根据列的不同,更新对应的字段
    QString value = item->text();
    QString sql;

    if (column == 1) {
        // 修改姓名
        sql = QString("update STU set name = '%1' where id = %2;").arg(value).arg(id);
    } else if (column == 2) {
        // 修改性别
        sql = QString("update STU set sex = '%1' where id = %2;").arg(value).arg(id);
    } else if (column == 3) {
        // 修改分数
        double score = value.toDouble();
        sql = QString("update STU set score = %1 where id = %2;").arg(score).arg(id);
    }

    // 执行SQL语句
    QSqlQuery query;
    if (!query.exec(sql)) {
        QMessageBox::information(this, "提示", "修改失败");
    }
}

void Widget::setupConnections()
{
    connect(ui->msgTable, &QTableWidget::itemChanged, this, &Widget::on_msgTable_itemChanged);
}

运行结果

思维导图


相关推荐
hccee9 分钟前
C# IO文件操作
开发语言·c#
hummhumm14 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
hunandede20 分钟前
av_image_get_buffer_size 和 av_image_fill_arrays
c++
J老熊24 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
寻找码源35 分钟前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
Matlab精灵36 分钟前
Matlab科研绘图:自定义内置多款配色函数
算法·matlab
zmd-zk38 分钟前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟42 分钟前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
诚丞成1 小时前
滑动窗口篇——如行云流水般的高效解法与智能之道(1)
算法
Alive~o.01 小时前
Go语言进阶&依赖管理
开发语言·后端·golang