QT:SQLITE数据库编程

news2024/11/18 21:34:25

pro文件:QT         += core gui sql

widget.ui

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w("./student.db");  //传入文件名
    w.show();

    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>  //数据库连接
#include <QSqlQuery>    //执行SQL语句

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QString filename, QWidget *parent = 0);  //数据库文件名,存储数据库的操作
    ~Widget();

    void showInfo();
    void clearInput();

private slots:

    void on_pb_add_clicked();

    void on_pb_delete_clicked();

    void on_pb_query_clicked();

    void on_pb_update_clicked();

private:
    Ui::Widget *ui;
    QSqlDatabase db_student;   //表示数据库的连接
    QString db_file_name;   //数据库文件名

};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFile>   //文件类
#include <QDebug>
#include <QSqlError>

Widget::Widget(QString filename, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    db_file_name(filename)
{
    ui->setupUi(this);
    ui->cbb_gender->setCurrentIndex(-1);
    ui->cbb_gender->setFixedSize(224,40);
    ui->te_table_content->setReadOnly(true);

    QFile file(db_file_name);  //要操作的文件名

    if(!file.exists())
    {
        //数据库文件不存在表示这个程序第一次被运行
        //连接数据库,创建数据库表,生成数据库文件
        //"QSQLITE"表示创建的是基于sqlite数据库的连接
        db_student = QSqlDatabase::addDatabase("QSQLITE");

        //设置数据库文件的名字
        db_student.setDatabaseName(db_file_name);

        //打开数据库
        if(!db_student.open())
        {
            qDebug() << "打开数据库失败1";
        }
        else
        {
            qDebug() << "打开数据库成功1";
        }

        //QSqlQuery用于SQL语句的执行,对返回结果的使用
        //要指定使用的数据库的连接 db_student
        QSqlQuery sql_query(db_student);

        //创建数据库表
        QString str_query = "create table Student(id varchar(64) PRIMARY KEY,name varchar(64),gender varchar(64),age int)";

        //执行SQL语句
        if(!sql_query.exec(str_query))
        {
            qDebug() << str_query <<"failed";
            qDebug() << sql_query.lastError().text();
        }

        //向数据库表Student插入数据(方式一)
        str_query = "insert into Student values('2310060001','张三','男',15)";
        if(!sql_query.exec(str_query))
        {
            qDebug() << str_query << "failed";
            qDebug() << sql_query.lastError().text();
        }

        //向数据库表Student插入数据(方式二)
        str_query = "insert into Student values(?,?,?,?)";

        //准备SQL语句
        sql_query.prepare(str_query);
        //绑定待定的数据,取代SQL语句里的?
        sql_query.addBindValue("2310060002");
        sql_query.addBindValue("李四");
        sql_query.addBindValue("男");
        sql_query.addBindValue(16);
        if(!sql_query.exec())
        {
            qDebug() << str_query << "failed";
            qDebug() << sql_query.lastError().text();
        }

        //向数据库表Student插入数据(方式三)
        str_query = "insert into Student values(:id,:name,:gender,:age)";
        sql_query.prepare(str_query);
        //绑定待定的数据
        sql_query.bindValue(":id","2310060003");
        sql_query.bindValue(":name","王五");
        sql_query.bindValue(":gender","女");
        sql_query.bindValue(":age",20);
        if(!sql_query.exec())
        {
            qDebug() << str_query << "failed";
            qDebug() << sql_query.lastError().text();  //打印具体错误
        }
    }
    else
    {
        db_student = QSqlDatabase::addDatabase("QSQLITE");

        //设置数据库文件的名字
        db_student.setDatabaseName(db_file_name);

        //打开数据库
        if(!db_student.open())
        {
            qDebug() << "打开数据库失败2";
        }
        else
        {
            qDebug() << "打开数据库成功2";
        }
    }

    // 显示Student表中所有的记录
    showInfo();
}

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


//更新信息显示
void Widget::showInfo()
{
    QSqlQuery sql_query(db_student);  //执行QSL语句

    QString str_query = "select * from Student";

    if(!sql_query.exec(str_query))
    {
        qDebug() << str_query << "failed";
        qDebug() << sql_query.lastError().text();
    }

    ui->te_table_content->clear();

    while(sql_query.next())  //获得当前的一整条记录
    {
        QString s1;
        for(int i = 0;i < 4;i++) //id,name,gender,age
        {
            s1 += sql_query.value(i).toString();  //获得一条记录中的第i个表项,0 base
            s1 += " ";
        }

        ui->te_table_content->append(s1);
    }
}


//清空
void Widget::clearInput()
{
    ui->le_id->clear();
    ui->le_name->clear();
    ui->cbb_gender->setCurrentIndex(-1);
    ui->le_age->clear();
}

//新增
void Widget::on_pb_add_clicked()
{
    QSqlQuery sql_query(db_student);

    QString str_query = "insert into Student values(?,?,?,?)";  //id,name,gender,age

    //准备SQL语句
    sql_query.prepare(str_query);

    //绑定待定的数据,取代SQL语句里的?
    sql_query.addBindValue(ui->le_id->text());
    sql_query.addBindValue(ui->le_name->text());
    sql_query.addBindValue(ui->cbb_gender->currentText());
    sql_query.addBindValue(ui->le_age->text().toInt());

    if(!sql_query.exec())
    {
        qDebug() << str_query << "failed";
        qDebug() << sql_query.lastError().text();
    }

    clearInput();
    showInfo();
}

//删除
void Widget::on_pb_delete_clicked()
{

    QSqlQuery sql_query(db_student);

    QString str_query = "delete from Student where id = :id";

    sql_query.prepare(str_query);

    sql_query.bindValue(":id",ui->le_id->text());

    if(!sql_query.exec())
    {
        qDebug() << str_query << "failed";
        qDebug() << sql_query.lastError().text();
    }

    clearInput();
    showInfo();
}

//查询
void Widget::on_pb_query_clicked()
{
    QSqlQuery sql_query(db_student);  //操作的数据库

    QString str_query = "select * from Student where id = :id";

    sql_query.prepare(str_query);

    sql_query.bindValue(":id",ui->le_id->text());

    if(!sql_query.exec())
    {
        qDebug() << str_query << "failed";
        qDebug() << sql_query.lastError().text();
    }

    while(sql_query.next())  //获得当前的一整条记录 id,name,gender,age
    {
        ui->le_name->setText(sql_query.value(1).toString());
        ui->cbb_gender->setCurrentText(sql_query.value(2).toString());
        ui->le_age->setText(sql_query.value(3).toString());
    }
}

//修改
void Widget::on_pb_update_clicked()
{
    QSqlQuery sql_query(db_student);

    QString str_query = "update Student set name = ?,gender = ?,age = ? where id = ?";

    sql_query.prepare(str_query);

    sql_query.addBindValue(ui->le_name->text());
    sql_query.addBindValue(ui->cbb_gender->currentText());
    sql_query.addBindValue(ui->le_age->text().toInt());
    sql_query.addBindValue(ui->le_id->text());

    if(!sql_query.exec())
    {
        qDebug() << str_query << "failed";
        qDebug() << sql_query.lastError().text();
    }

    clearInput();
    showInfo();
}

结果

新增

删除

查询

修改

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

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

相关文章

binary_cross_entropy和binary_cross_entropy_with_logits的区别

binary_cross_entropy和binary_cross_entropy_with_logits的区别 引言 二分类问题是常见的机器学习任务之一&#xff0c;其目标是将样本分为两个类别。为了训练一个二分类模型&#xff0c;通常使用交叉熵作为损失函数。 二分类交叉熵损失函数有两种不同的形式&#xff0c;分…

深度学习之人脸检测算法

检测方法&#xff1a; Haar cascade opencv HOG Dlib CNN Dlib SSD MTCNN Haar特征 1.Haar特征原理综述 Haar特征是一种反映图像的灰度变化的&#xff0c;像素分模块求差值的一种特征。它分为三类&#xff1a;边缘特征、线性特征、中心特征和对角线特征。用黑白两种…

EQ 均衡器

EQ 的全称是 Equalizer&#xff0c;EQ 是 Equalizer 的前两个字母&#xff0c;中文名字叫做“均衡器”。最早是用来提升电话信号在长距离的传输中损失的高频&#xff0c;由此得到一个各频带相对平衡的结果&#xff0c;它让各个频带的声音得到了均衡。 EQ 的主要功能是&#xf…

端口隔离 MAC地址安全配置

二、知识点 目前网络中以太网技术的应用非常广泛。然而&#xff0c;各种网络攻击的存在&#xff08;例如针对ARP、DHCP等协议的攻击&#xff09;&#xff0c;不仅造成了网络合法用户无法正常访问网络资源&#xff0c;而且对网络信息安全构成严重威胁&#xff0c;因此以太网交…

学习笔记|串口通信的基础知识|同步/异步|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择模式选择 3.串口通信代码实现编写串口1通信程序测试 总结 1.串口通信的基础知识 百度百科&#xff1a;串口通信的概…

STM32F103C8t SPI1重映射到PB3 PB4 PB5无输出

STM32F103C8t6用到了ADC 和SPI 导致PAx口无法使用SPI1 因此像复用到的引脚&#xff0c; 检查后发现硬件SPI可以复用到PB3 PB4 PB5&#xff0c; MSIO&#xff1a;PB5 MOSI&#xff1a;PB4 SCK&#xff1a;PB3 但是尝试后发现没有反映 SCK引脚没有波形输出 GPIO_PinRemapConfig(…

使用pywin32读取doc文档的方法及run输出乱码 \r\x07

想写一个读取doc文档中表格数据&#xff0c;来对文档进行重命名。经查资料&#xff0c;py-docx无法读取doc文档&#xff0c;原因是这种是旧格式。所以&#xff0c;采用pywin32来进行读取。 import win32com.client as win32word win32.gencache.EnsureDispatch(Word.Applicati…

Fiddler的下载安装及使用(包括在测试中的使用)

一、Fiddler的下载安装 1.Fiddler的介绍 1.1 Fiddler的定义和功能 Fiddler是一款免费网络代理调试工具。 Fiddler是一个很好用的抓包工具&#xff0c; 可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。 也可以用来检测网络安全。 1.2 Fiddler的工作原理…

JUC第十六讲:JUC集合: CopyOnWriteArrayList详解

JUC第十六讲&#xff1a;JUC集合: CopyOnWriteArrayList详解 本文是JUC第十六讲&#xff0c;JUC集合: CopyOnWriteArrayList详解。CopyOnWriteArrayList是ArrayList 的一个线程安全的变体&#xff0c;其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现…

linux系统中三个重要的结构体

第一​&#xff1a;struct inode结构体 struct inode { struct hlist_node i_hash; struct list_head i_list; /* backing dev IO list */ struct list_head i_sb_list;​ //主次设备号 dev_t i_rdev;​ struct list_head i_devices; //用联合体是因为该…

山西省行政村边界数据/乡镇街道边界数据/行政区划边界分布

山西&#xff08;简称&#xff1a;晋&#xff0c;别称&#xff1a;三晋&#xff0c;古称河东&#xff09;&#xff0c;中华人民共和国省级行政区&#xff0c;省会太原市&#xff0c;位于黄河中游东岸&#xff0c;华北平原西面的黄土高原上。东以太行山为界&#xff0c;与河北为…

019 基于Spring Boot的教务管理系统、学生管理系统、课表查询系统

基于Spring Boot的教务管理系统、学生管理系统、课表查询系统 一、系统介绍 本作品主要实现了一个课表查询系统&#xff0c;采用了SSM&#xff08;Spring SpringMVC MyBatis&#xff09;的基础架构。 二、使用技术 spring-bootspring-MVCthymeleafmybatis-plusdruidLombo…

Ae 效果:CC Lens

扭曲/CC Lens Distort/CC Lens CC Lens &#xff08;CC 镜头&#xff09;主要用于添加或移除摄像机镜头扭曲&#xff0c;比如桶形失真 Barrel、枕形失真 Pincushion以及鱼眼失真 Fisheye等。或者&#xff0c;用它来创建一些特殊的动画效果。 ◆ ◆ ◆ 效果属性说明 Center 中…

数据结构 2.1 单链表

1.单链表 线性表&#xff1a;1.有限的序列 2.序列中的每一个元素都有唯一的前驱和后继&#xff0c;除了开头和结尾的两个节点。 顺序表&#xff1a;分配一块连续的内存去存放这些元素&#xff0c;eg、数组 链表&#xff1a;内存是不连续的&#xff0c;元素会各自被分配一块内…

防抖和节流的实现

防抖和节流的实现 什么是防抖和节流实现防抖和节流防抖节流 防抖和节流的应用场景 什么是防抖和节流 防抖和节流是前端开发中常用的两种性能优化技术。 为什么需要防抖和节流呢&#xff1f; 两者目的都是为了防止某个时间段内操作频繁触发&#xff0c;造成性能消耗。 防抖&…

gin路由相关方法

c.Request.URL.Path 拿到请求的路径 package mainimport ( "fmt" "github.com/gin-gonic/gin" "net/http")//路由重定向&#xff0c;请求转发&#xff0c;ANY &#xff0c;NoRoute&#xff0c;路由组func main() { r : gin.Default() // -------…

Python 无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …

Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar

原文网址&#xff1a;Spring注册Bean系列--方法5&#xff1a;ImportImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;ImportImportBeanDefinitionRegistrar。 注册Bean的方法我写了一个系列&#xff0c;见&#xff…

NAT模式和桥接模式的区别

NAT模式和桥接模式的区别 NAT模式和桥接模式都是虚拟机网络配置的两种方式&#xff0c;主要区别在于虚拟机与外部网络交互的方式不同。 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;模式&#xff1a;在这种模式下&#xff0c;虚拟机和宿主…

SystemUI状态栏

SystemUI状态栏 1、日志开关2、相关属性配置3、Statusbar界面启动 android13-release 1、日志开关 Log.isLoggable通过设置属性&#xff0c;重启应用&#xff1b;Compile.IS_DEBUG日志开关是src-debug和src-release版本区别 frameworks\base\packages\SystemUI\src\com\android…