QT 中 sqlite 数据库使用

一、前提

	--pro文件添加sql模块
	QT += core gui sql

二、使用

说明
	--用于与数据库建立连接
	QSqlDatabase
	--执行各种sql语句
	QSqlQuery
	--提供数据库特定的错误信息
	QSqlError
查看qt支持的驱动
    QStringList list = QSqlDatabase::drivers();
    qDebug()<<list;
连接 sqlite3 数据库

声明:

	#include <QSqlDatabase>
	QSqlDatabase db;	//该类对象,就相当于一个数据库

实现:

	--通常放在构造函数中
	// 加载驱动
	db = QSqlDatabase::addDatabase("QSQLITE");  //QSQLITE驱动--连接的是sqlite3数据库
	                                            //连接成功,返回一个数据库对象
	// 设置数据库名
	db.setDatabaseName("company.db");//数据库文件后缀:.db	
	// 打开数据库  
	if(!db.open())  //open打开成功返回 true                
	{               
	    qDebug()<<"数据库打开失败:"<<db.lastError();   //lastError:返回有关数据库上发生的最后一个错误的信息。
	}
执行 sql 语句
    // 创建对象
    QSqlQuery query;    //创建该对象是,系统自动完成和数据库的关联
    // 定义一条创建表的sql语句
    QString createTable = "create table staffInformation (id integer, name varchar(20), age int) ";
    // 执行sql语句
    if(!query.exec(createTable)){
        qDebug() <<"create table error:" <<db.lastError();
    }
    // 插入数据
    QString insertData = "insert into staffInformation(id, name, age) values(1, 'chen', 18)";
    // 执行sql语句
    if(!query.exec(insertData)){
        qDebug() <<"insert data error:" <<db.lastError();
    }
	// 查询数据
    QString selectData = "select * from staffInformation";
    // 执行sql语句
    if(!query.exec(selectData)){
        qDebug() <<"select data error:" <<db.lastError();
    }else{
        while (query.next()) {
            qDebug() <<query.value("id").toUInt()
                     <<query.value("name").toString()
                     <<query.value("age").toUInt();
        }
    }
    //删除数据
    QString deleteData = "delete from staffInformation where id = 1;";
    // 执行sql语句
    if(!query.exec(deleteData)){
        qDebug() <<"delete data error:" <<db.lastError();
    }
    // 更新数据
    QString updateData = "update staffInformation set name = 'yuan' where id = 1;";
    // 执行sql语句
    if(!query.exec(updateData)){
        qDebug() <<"update data error:" <<db.lastError();
    }
使用 QSqlQueryModel 模型查询数据( QSqlQUeryModel 默认是只读数据模型)
    // 创建对象,并设置表头信息
    QSqlQueryModel *model = new QSqlQueryModel;
    // 执行sql语句
    model->setQuery("select * from staffInformation");	//将查询的结果转换成model对象(结果集)
    // 根据需求设置表头信息
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "name");
    model->setHeaderData(2, Qt::Horizontal, "age");
    // 给ui控件设置模型
    QTableView *tableView = new QTableView(this);
    tableView->setFixedSize(this->width(), this->height());//设置tableView大小
    tableView->setModel(model);	//传入表格模型
    tableView->show();   //显示表格
使用 QSqlQueryModel 模型修改数据

1,创建一个类,重写 QSqlQueryModel 虚函数

public:
    //重写基类虚函数
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); //修改数据库数据
    Qt::ItemFlags flags(const QModelIndex &index) const;    // 表格可编辑状态设置

private:
    //自定义函数接口
    void refresh();//更新数据

    bool setName(int useId, const QString &name);//根据需求修改表中的数据
//修改数据库数据
bool eidtQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    //判断是否有效列
    if(index.column() < 1 || index.column() > 3)
        return false;
    
    //获取列对应的 id
    QModelIndex prinmaryIndex = QSqlQueryModel::index(index.row(), 0);
    int id = this->data(prinmaryIndex).toInt(); //获取表中字段的 id

    // 在修改行时,将整个model清空
    this->clear();

    //根据需求修改对应的列
    bool ok = false  ;
    if(index.column() == 1)
    {
        ok = setName(id, value.toString());
    }

    //刷新数据
    refresh();
    return ok;
}

// 表格可编辑状态设置
Qt::ItemFlags eidtQueryModel::flags(const QModelIndex &index) const
{
    // 获取原有单元格的编辑状态
    Qt::ItemFlags flag = QSqlQueryModel::flags(index);

    // 给原有标志位增加一个可编辑的标志
    if(index.column() == 1) //仅限第一列可编辑
        flag = flag | Qt::ItemIsEditable;   //给它设置一个可编辑的状态

    return flag;
}

//更新数据
void eidtQueryModel::refresh()
{
    //相当于将数据库的数据查询出来,转换成一个model
    this->setQuery("select * from staffInformation");
    this->setHeaderData(0, Qt::Horizontal, "name"); //设置表头
}

//根据需求修改表中的数据
bool eidtQueryModel::setName(int useId, const QString &name)
{
    //相当于一个刷新操作
    QSqlQuery query;
    query.prepare("update staffInformation set name = ? where id = ?");
    query.addBindValue(name);
    query.addBindValue(useId);
    return query.exec();
}

2,使用

    // 创建模型对象
    eidtQueryModel *model = new eidtQueryModel;
    //执行sql
    model->setQuery("select id, name, age from staffInformation");
    //设置表头
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "name");
    model->setHeaderData(2, Qt::Horizontal, "age");

    //给ui控件设置模型
    QTableView *tableView = new QTableView(this);
    tableView->setFixedSize(this->width(), this->height());//设置tableView大小
    tableView->setModel(model);// 传入表格模型
    tableView->show();   // 显示表格

三、其他

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

总结的一些MySql面试题

目录 一&#xff1a;基础篇 二&#xff1a;索引原理和SQL优化 三&#xff1a;事务原理 四&#xff1a;缓存策略 一&#xff1a;基础篇 1&#xff1a;定义&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的…

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…

什么是分库?分表?分库分表?

分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓“分库分表”&#xff0c;根本不是一回事&#xff0c;而是三件事&#xff0c;他们要解决的问题也都不一样。 这三个事分别是“只分库不分表”、“只分表不分库”、以…

前端常用缓存技术深度剖析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

A3026 Java+jsp+servlet+mysql高校学生请假管理系统

高校学生请假管理系统 1.摘要2. 绪论3.功能结构4.界面展示5.源码获取 1.摘要 高校学生请假管理系统 摘要&#xff1a;随着计算机的发展与不断进步&#xff0c;各个领域都出现了新的技术&#xff0c;曾经各种规模之间的竞争已经发展成为技术之间的竞争&#xff0c;管理和人才之…

机器学习周报(12.2-12.8)

文章目录 摘要Abstract Vision Transformer1 原理2 代码 摘要 本周学习了Vision Transformer (ViT) 的基本原理及其实现&#xff0c;并完成了基于PyTorch的模型训练、验证和预测任务。深入理解了ViT如何将图像分割成patch作为输入序列&#xff0c;并结合Transformer Encoder处…

Jmeter Address already in use: connect 解决

做压测接口时&#xff0c;并发一段时间后&#xff0c;会报java.net.BindException: Address already in use: connect 原因&#xff1a; windows提供给TCP/IP链接的端口为 1024-5000&#xff0c;并且要四分钟来循环回收它们&#xff0c;就导致在短时间内跑大量的请求时将端口占…

深入解析 HTML Input 元素:构建交互性表单的核心

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

力扣打卡10:K个一组翻转链表

链接&#xff1a;25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 这道题需要在链表上&#xff0c;每k个为一组&#xff0c;翻转&#xff0c;链接。 乍一看好像比较容易&#xff0c;其实有很多细节。比如每一组反转后怎么找到上一组的新尾&#xff0c;怎么找到…

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…

Android显示系统(04)- OpenGL ES - Shader绘制三角形

Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角形 Android显示系统&#xff08;05&#xff09;- OpenGL…

Ubuntu 22.04安装Nessus(离线激活模式)

Ubuntu 22.04安装Nessus 一、 Nessus 简介二、Nessus下载安装三、激活Nessus四、创建一个基础扫描五、 破解Nessus只能扫描16个地址的限制六、更新插件 一、 Nessus 简介 Nessus 官网&#xff1a; https://www.tenable.com/ Nessus号称世界上最流行的扫描程序&#xff0c;Nessu…

OpenAI 发布 o1 LLM,推出 ChatGPT Pro

OpenAI正式发布了专为复杂推理而构建的 OpenAI o1大型语言模型(LLM)。 该公司还推出了 ChatGPT Pro&#xff0c;这是一项每月 200 美元的套餐&#xff0c;包括无限制访问 OpenAI o1、o1-mini、GPT-4o 和高级语音对话。 OpenAI o1 从 9 月 12 日起在 ChatGPT 中推出预览版&…

上海理工大学《2024年867自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《上海理工大学867自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

汽配行业数字化解决方案(一)

汽配行业数字化解决方案&#xff0c;是通过整合云计算、大数据、人工智能、物联网等先进技术&#xff0c;构建一个全面、高效、智能的数字化生态系统&#xff0c;以实现汽配供应链的全程可视化与智能化管理。该解决方案涵盖了从供应商管理、库存优化、订单处理、物流跟踪到客户…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的SGD优化器案例实现

SGD优化器基本原理讲解 随机梯度下降&#xff08;SGD&#xff09;是一种迭代方法&#xff0c;其背后基本思想最早可以追溯到1950年代的Robbins-Monro算法&#xff0c;用于优化可微分目标函数。 它可以被视为梯度下降优化的随机近似&#xff0c;因为它用实际梯度&#xff08;从…

集成学习综合教程

一、前置知识 一个分类器的分类准确率在60%-80%&#xff0c;即&#xff1a;比随机预测略好&#xff0c;但准确率却不太高&#xff0c;我们可以称之为 “弱分类器”&#xff0c;比如CART&#xff08;classification and regression tree 分类与回归树&#xff09;。 反之&#x…

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习&#xff08;被拷打太多次了&#xff09;&#xff0c;然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 2024-12-7: 对公式…

【开源免费】基于SpringBoot+Vue.JS中小型医院网站(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 078 &#xff0c;文末自助获取源码 \color{red}{T078&#xff0c;文末自助获取源码} T078&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

哈希知识详解

一、哈希 以前&#xff0c;在面对海量数据的查找时&#xff0c;最快就是红黑树 logN&#xff0c;无法满足需求。 于是探索出了另一种用关键字 key 值与其存储位置建立映射的思想&#xff0c;让查找效率提升到 O(1) &#xff0c;这个就是哈希。 二、哈希函数 1、直接定值法 ①…