QT C++ 读写mySQL数据库 图片 例子
在上篇文章中描述了怎样搭建读写数据库的环境。
本文更进一步,描述了读写mySQL数据库,字符、整型数字、图片。读写图片相对难点。
数据库的图片字段用BLOB,如果图片较大要用longblob,否则会报错。
另外,读写数据库都使用了短连接,完成后关闭连接
本文代码在QT6.2.4 MSVC2019 +MySQL5.7.44_X64 调试通过。

//1.数据库字段

图1-数据库字段示意图
//2.界面

图2-界面
//3.代码
//3.1 头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QtSql/qtsql>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void initUI();//初始化界面
QPushButton* btn_write ;//写入按钮
QPushButton* btn_read;//读取按钮
QLabel * lb_name;//显示姓名
QLabel * lb_age;//显示年龄
QLabel * lb_picture;//显示图片
private:
Ui::Widget *ui;
QByteArray m_imageData2;//图片的字节数组
QString m_name;//姓名变量
int m_age;//年龄变量
private slots:
void btn_write_click();//写入按钮子程序
void btn_read_click();//读取按钮子程序
};
#endif // WIDGET_H
//-----------------------------------------------------------------------------------------------------------
//3.2 cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
initUI();
}
void Widget::initUI()
{
QVBoxLayout* vlayout = new QVBoxLayout();
btn_write = new QPushButton(this);
btn_write->setText("写入数据库");
btn_write->setFixedWidth(100);
vlayout->addWidget(btn_write);
btn_read = new QPushButton(this);
btn_read->setText("读数据库");
btn_read->setFixedWidth(100);
vlayout->addWidget(btn_read);
lb_name=new QLabel("待读出姓名");
lb_name->setFixedWidth(100);
vlayout->addWidget(lb_name);
lb_age=new QLabel("待读出年龄");
lb_age->setFixedWidth(100);
vlayout->addWidget(lb_age);
lb_picture=new QLabel("待读出图片");
vlayout->addWidget(lb_picture);
setLayout(vlayout);
QObject::connect(btn_write, &QPushButton::clicked,this,&Widget::btn_write_click);
QObject::connect(btn_read, &QPushButton::clicked,this,&Widget::btn_read_click);
}
void Widget::btn_write_click()
{
qDebug()<<QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("db_name");//你自己的数据库名称
db.setUserName("root");
db.setPassword("123456");
if (!db.open()) {
qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
return ;
}
else
{
qDebug()<<"数据库连接成功";
}
QString imagePath = "d:/Pictures/LeiJun.png";
// Read image file
QFile file(imagePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Error: Failed to open image file";
return ;
}
QByteArray imageData = file.readAll();
QSqlQuery query;
query.prepare("INSERT INTO test (name, age,image) VALUES (:value1, :value2, :value3)");
query.bindValue(":value1", "LeiJun");
query.bindValue(":value2", 50);
query.bindValue(":value3", imageData);
if (!query.exec())
{
qDebug() << "Failed to insert data. Error: " << query.lastError().text();
db.close();
return ;
}
qDebug() << "Data inserted successfully";
db.close();
}
void Widget::btn_read_click()
{
qDebug()<<QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("db_name");//你自己的数据库名称
db.setUserName("root");
db.setPassword("123456");
if (!db.open()) {
qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
db.close();
return ;
}
else
{
qDebug()<<"数据库连接成功";
}
//读图片
QSqlQuery query;
query.exec("SELECT * FROM test WHERE name = 'LeiJun' LIMIT 1;");
if (!query.next()) {
qDebug() << "Error: Failed" << query.lastError().text();
db.close();
return ;
}
else
qDebug() << "读数据成功";
//姓名
m_name = query.value(0).toString();
qDebug()<<m_name;
lb_name->setText(m_name);
//年龄
m_age = query.value(1).toInt();
qDebug()<<m_age;
lb_age->setText(QString::number(m_age));
//图片的二进制
m_imageData2 = query.value(2).toByteArray();//转换成字节数组
// Create image from data
QPixmap pixmap;
pixmap.loadFromData(m_imageData2);
lb_picture->setPixmap(pixmap);显示图片
db.close();
}
Widget::~Widget()
{
delete ui;
}
//4.代码下载链接
https://download.csdn.net/download/weixin_39926429/89374527
相关文章:
QT C++ 读写mySQL数据库 图片 例子
在上篇文章中描述了怎样搭建读写数据库的环境。 本文更进一步,描述了读写mySQL数据库,字符、整型数字、图片。读写图片相对难点。 数据库的图片字段用BLOB,如果图片较大要用longblob,否则会报错。 另外,读写数据库都使用了短连…...
Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数
1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 (1)专用进程:ID为0的进程是调度进程,常常被称为交换进程,也称为系统进程; ID为1通常是init进程,在自举结束时由内核调用…...
Facebook之魅:数字社交的体验
在当今数字化时代,Facebook作为全球最大的社交平台之一,承载着数十亿用户的社交需求和期待。它不仅仅是一个简单的网站或应用程序,更是一个将世界各地的人们连接在一起的社交网络,为用户提供了丰富多彩、无与伦比的数字社交体验。…...
【重装windows遇到网络适配器无法更改】
可以尝试手动在cmd中修改,命令: netsh interface ip set address name"以太网 x" static 新IP地址 子网掩码 网关 注意以太网x之间有空格,以太网外面的引号是英文的。 也可以先在cmd依次输入“netsh”、“interface”࿰…...
FFmpeg+QT播放器实战1---UI页面的设计
1、播放器整体布局的设计 该部分使用QT的UI工具,进行整体页面设置,如下图1所示: 2、控制布局的设计 创建ctrBar的UI页面并进行页面布局设置,如下图2所示: 将图1中ctrBarWind对象提升为ctrBar类(该界面替代原先的控…...
C/C++语法|pthread线程库的使用
笔记主要内容来自 爱编程的大柄–线程 爱编程的大柄–线程同步 在进入代码实践之前,我们应该搞清楚。 线程是成语的最小执行单位,进程是操作系统中最小的资源分配单位。 这样的话我们可以理解以下两点: 同一地址空间中的多个线程独有的是&…...
四川汇聚荣聚荣科技有限公司是正规的吗?
在当今社会,随着科技的飞速发展,越来越多的科技公司如雨后春笋般涌现。然而,在这个信息爆炸的时代,如何判断一家公司是否正规成为了许多人关注的焦点。本文将围绕“四川汇聚荣聚荣科技有限公司是否正规”这一问题展开讨论…...
tomcat学习--部署java项目
主流开发项目,springboot框架下,jar部署java传统的tomcat发布war包 一 什么是tomcat? 是一个用于运行java程序的软件,发布的时候:开发将源码使用maven打包,生产war包 二 安装tomcat tomcat是java写的&a…...
用 vue3 + phaser 实现经典小游戏:飞机大战
本文字数:7539字 预计阅读时间:30分钟 01 前言 说起小游戏,最经典的莫过于飞机大战了,相信很多同学都玩过。今天我们也来试试开发个有趣的小游戏吧!我们将从零开始,看看怎样一步步实现一个H5版的飞机大战&a…...
【Linux|数据恢复】extundelete和ext4magic数据恢复工具使用
环境:Centos7.6_x86 一、extundelete工具 1、extundelete介绍 Extundelete 是一个数据恢复工具,用于从 ext3 或 ext4 分区中恢复删除文件。根据官网0.2.4版本介绍是支持ext4,但实际上使用发现ext4格式不行,会报以下错误…...
用户接入和认证技术
一、用户接入和认证配置 称为网络接入控制,通过对接入网络的客NAC (Network Admission Control)户端和用户的认证保证网络的安全,是一种“端到端”的安全技术。包括802.1x认证、MAC认证与Portal认证。 二、三种认证方式简介 1、Portal认证 Portal认证通…...
【面试】Java虚拟机的生命周期
目录 1. 说明2. 启动(Initialization)3. 运行(Running)4. 服务(Servicing)5. 终止(Termination) 1. 说明 1.Java虚拟机(JVM)的生命周期通常指的是JVM实例从启…...
Nginx高可用性架构:实现负载均衡与故障转移的探索
随着网络应用的不断发展和用户访问量的增长,如何确保系统的高可用性、实现负载均衡以及快速响应故障转移成为了每个运维和开发团队必须面对的挑战。Nginx作为一款高性能的HTTP和反向代理服务器,凭借其强大的功能和灵活的配置,成为了实现这些目…...
计算机网络-运输层
运输层 网络层在两个端系统之间的交付服务拓展到运行在两个不同端系统上的应用层进程之间的交付服务。 概述和运输层服务 运输层协议为运行在不同主机上的引用进程之间提供了逻辑通信功能。通过逻辑通信,运行在不同进程之间的主机好像直接连接一样。 运输层协议…...
网络通信(一)
网络编程 1.网络编程概念及相关名词 : 网络编程是计算机科学中一个重要的领域,它涉及到在不同计算机之间通过计算机网络进行通信和数据交换的程序设计。网络编程的核心是实现网络通信协议,这些协议定义了数据如何在网络上发送、接收和解释。…...
Linux环境中部署docker私有仓库Registry与远程访问详细流程
目录 前言 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程推送Docker Registry 6. 固定Docker Registry公网地址 前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊…...
springboot项目使用validated参数校验框架
目录 前言 一、validated是什么? 二、使用步骤 1.引入maven依赖 2.使用实现 总结 前言 当谈到Spring的参数校验功能时,Validated注解无疑是一个重要的利器。它为我们提供了一种简单而又强大的方式来验证请求参数的合法性,保证了系统的稳…...
Azure Chatgpt demo部署——本地CentOS Docker
参见上一篇 http://t.csdnimg.cn/JcyfM 由于本地部署环境,与之前系统、网络、配置等环境不同,可能会遇见一些新的问题。 取2023年8月27日代码 git checkout -b a02796b063381c10ca9ca8189590b289a4d09129 由于本地情况的网络等环境不太一样,…...
MybatisPlus中自定义sql
背景 在开发过程中,可能会出现除了where条件,其它sql比较复杂,这时候就需要用到自定义sql了。 问题 如:用户状态为正常的数据年龄加一(所有用户年龄加一) 数据库中sql: UPDATE USER SET…...
HCIA--DHCP: 动态主机配置协议 (复习)
DHCP: 动态主机配置协议 -- 同一分发管理ip地址 基于UDP 67/68端口工作 网络中存在DHCP的服务器为需要自动生成ip地址的设备分配ip地址;--C/S模型 成为DHCP服务器的条件: 该设备存在接口或网卡连接到所要分发ip地址的广播域内该接口或网卡必须已经配置…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
