QT数据库,实现数据库增删改查

news2024/12/23 0:23:08

QT关于数据库的相关概念

QT将数据库分为三个层次:

数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin

sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError

用户接口层:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel

实现数据库操作的相关方法

添加数据库:

[static] QSqlDatabase QSqlDatabase::addDatabase(
    QSqlDriver *driver, 
    const QString &connectionName = QLatin1String(defaultConnection)) 
QSQLITE SQLite version 3 or above 

设置数据库名称:

​​​​​​​void QSqlDatabase::setDatabaseName(const QString &name)

包含数据库:

bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection)) 

打开数据库:

​​​​​​​bool QSqlDriver::open(const QString &db)

关闭数据库:

void QSqlDatabase::close() 

错误信息:

QSqlError QSqlDatabase::lastError()

sql语句执行:构造一个QSqlQuery类对象,调用其成员函数exec,执行sql语句

bool QSqlQuery::exec(const QString &query)

遍历查询结果的函数:

bool QSqlQuery::next()

通过数据库实现学生管理系统

功能界面:

主要功能代码

#include "widget.h"
#include "ui_widget.h"

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

    //判断数据库对象是否包含了自己使用的数据库,例如Student.db
    if(!db.contains("Student,db"))
    {
        //添加一个数据库
        //函数原型:static QSqlDatabase addDatabase(const QString& type);
        //参数:数据库版本
        //返回值:添加的数据库
        db = QSqlDatabase::addDatabase("QSQLITE");      //表示使用的是sqlite3版本的数据库


        //给数据库命名
        db.setDatabaseName("Student.db");
    }

    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this, "提示", "数据库打开失败");
        return;
    }

    //代码执行到这说明数据库创建并打开完毕,就可以创建数据表了
    //创建数据表需要使用sql语句,需要使用QsqlQuery类对象来完成
    //准备sql语句
    QString sql = "create table if not exists myTable("           //创建表的sql语句
                  "id integer primary key autoincrement,"       //id主键,允许自增
                  "numb integer,"                               //学号
                  "name varchar(10),"                           //姓名
                  "score integer,"                              //分数
                  "sex varchar(4))";                            //性别
    //定义语句执行者
    QSqlQuery query;
    //使用query执行sql语句
    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "创建表失败");
    }else{
        QMessageBox::information(this, "成功", "创建表成功");
    }
}

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

//录入按钮对应的槽函数
void Widget::on_pushButton_clicked()
{
    //获取ui界面中要存入数据库中的数据
    int numb_ui = ui->lineEdit->text().toInt();      //获取UI界面的学号
    QString name_ui = ui->lineEdit_2->text();        //获取UI界面的姓名
    int score_ui = ui->lineEdit_3->text().toInt();   //获取UI界面的成绩
    QString sex_ui = ui->lineEdit_4->text();         //获取UI界面的性别

    if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty())
    {
        QMessageBox::information(this, "提示", "请将信息填写完整");
        return;
    }

    //准备sql语句
    QString sql =QString("insert into myTable(numb, name, score, sex) values (%1, '%2', %3, '%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);

    //定义语句执行者
    QSqlQuery query;

    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "录入数据失败");
    }else{
        QMessageBox::information(this, "成功", "录入数据成功");
    }

    //清除
    ui->lineEdit->clear();
    ui->lineEdit_2->clear();
    ui->lineEdit_3->clear();
    ui->lineEdit_4->clear();

}

//展示按钮对应的槽函数
void Widget::on_pushButton_2_clicked()
{
    //准备sql语句
    QString sql = "select * from myTable";

    //定义语句执行者
    QSqlQuery query;

    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "没有找到数据");
        return;
    }

    //将查找到的所有结果都放到query对象中
    //可以通过next函数不断遍历查询结果
    int i = 0;          //记录行号
    while(query.next())
    {
        //遍历的是任意一组记录,query.record
        //要找到每条记录中的每个数据,使用value(i)
        //将数据库中的表格战术到UI界面
        //ui->tableWidget->setItem()
        //query.record().value()

        for(int j=0; j<query.record().count()-1; j++)
        {
            ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.record().value(j+1).toString()));
        }
        i++;
    }
}

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

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

相关文章

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…

创建具有管理员权限的快捷方式

参考 https://zhidao.baidu.com/question/86334639.html

【AI】机器学习——绪论

文章目录 1.1 机器学习概念1.1.1 定义统计机器学习与数据挖掘区别机器学习前提 1.1.2 术语1.1.3 特点以数据为研究对象目标方法——基于数据构建模型SML三要素SML步骤 1.2 分类1.2.1 参数化/非参数化方法1.2.2 按算法分类1.2.3 按模型分类概率模型非概率模型逻辑斯蒂回归 1.2.4…

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程&#xff0c;使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程&#xff0c;让团队有更多的时间来执行高价值的任务&#xff0c;而不是陷于一堆琐碎事情中。 什么是CRM自动化&#xff1f; CRM 自动化是指 C…

SD卡中了蠕虫病毒怎么办?清除病毒以及数据恢复方法

蠕虫病毒是近年来非常流行的病毒之一&#xff0c;它主要通过U盘、网络等途径进行传播。如果你的SD卡不幸感染了蠕虫病毒&#xff0c;可能会导致数据丢失。那么&#xff0c;如何进行数据恢复呢&#xff1f;同时&#xff0c;当SD卡中感染了蠕虫病毒时&#xff0c;我们应该采取什么…

Java“牵手”阿里巴巴商品详情数据,阿里巴巴商品详情API接口,阿里巴巴国际站API接口申请指南

阿里巴巴平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取阿里巴巴商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xf…

第8篇:ESP32连接超声波HC-SR04测距点亮LED无源喇叭播放声音

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloworld第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播放音乐《涛声…

【java基础复习】如何理解java中基本数据类型里的自动类型提升和强制类型转换?

自动类型提升强制类型转换注意事项 ❗感谢 &#x1f496; Java是一种强类型语言&#xff0c;这意味着在编写代码时&#xff0c;需要明确指定每个变量的数据类型。我们知道&#xff0c;java中有八大基本数据类型。分别是&#xff1a; 数据类型大小&#xff08;字节数&#xff0…

2024年java面试--多线程(4)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…

BCSP-玄子Share-Java框基础_双系统Redis安装与基础语法

四、Redis 4.1 Redis 简介 Redis 是开源、高性能的key-value数据库&#xff0c;属于 NoSQL 数据库 NoSQL 数据库与关系型数据库 关系型数据库&#xff1a;采用关系模型来组织数据&#xff0c;主要用于存储格式化的数据结构NoSQL 数据库&#xff1a;泛指非关系型数据库&…

力扣|找出和所对应的两数的下标

从零开始刷力扣&#xff08;bushi 题目放在这&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

数电发票开票接口

全电发票&#xff0c;也叫数电发票&#xff0c;全称为全面数字化的电子发票。数电发票是依托可信身份体系和电子发票服务平台&#xff1b;以去介质、去版式、标签化、要素化、授信制、赋码制为基本特征&#xff1b;覆盖全领域、全环节、全要素的全新发票。与纸质发票具有同等法…

tkinter控件样式

文章目录 以按钮为例共有参数动态属性 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框&#x1f48e;控件样式扫雷小游戏&#x1f48e;强行表白神器 以按钮为例 tkinter对控件的诸…

05-Redis

1、Redis为什么快&#xff1f; 1、纯内存操作 2、单线程可以省去多线程时CPU上下文会切换的时间 3、渐进式ReHash、缓存时间戳 数组需要扩容的时候&#xff0c;他会维护两张hash表&#xff0c;比如第一张的数组长度为6&#xff0c;另一张的数组长度为12&#xff0c;在set和g…

JavaScript中的事件循环(event loop)机制

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 调用栈&#xff08;Call Stack&#xff09;⭐ 消息队列&#xff08;Message Queue&#xff09;⭐ 事件循环&#xff08;Event Loop&#xff09;⭐ 宏任务和微任务⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇…

如何取消KEIL-MDK工程中出现的CMSIS绿色图标

如何取消KEIL-MDK工程中出现的CMSIS绿色图标&#xff1f;我以前经常遇到&#xff0c;不知道怎么搞&#xff0c;好像也不影响编译结果。以前问过其他人&#xff0c;但是不知道怎么搞&#xff0c;相信很多人也遇到过。水平有限&#xff0c;表达不清楚&#xff0c;见下图&#xff…

Java 反射调用自己写的对象方法

一、java 反射的定义 定义&#xff1a;JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法&#xff0c;这种动态获取、调用对象方法的功能称为java语言的…

JavaScript 中的原型到底该如何理解?

JavaScript作为一个基于原型的OOP&#xff0c;和我们熟知的基于类的面向对象编程语言有很大的差异。如果不理解其中的本质含义&#xff0c;则无法深入理解JavaScript的诸多特性&#xff0c;以及由此产生的诸多“坑”。在讨论“原型”的概念之前&#xff0c;我们先来讨论一下“类…

APS系统设计经验分享(时间推导II - 2023.09)

在前一篇关于APS系统设计分享文章(《APS系统设计经验分享(时间推导 - 2023.03)》)中&#xff0c;我们提到将会分享使用OptaPlanner作为规划引擎开发APS系统过程中&#xff0c;遇到的一些时间相关的设计建议与异常情况分析。后来一直忙于项目工作&#xff0c;直到现在才想起仍欠…

CSS---flex布局

主要记录flex布局的要点以及实例 flex flex父标签的6个属性flex-direction: flex布局的方向flex-wrap: 是否可以换行flex-flow: flex-direction 和 flex-wrap 一起写justify-content&#xff1a;横向对齐方式align-items: 纵向对齐方式align-content: 有换行情况下的纵向对齐方…