QT C++ 读写mySQL数据库 图片 例子

news2024/11/18 13:56:18

在上篇文章中描述了怎样搭建读写数据库的环境。

本文更进一步,描述了读写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";

    // QString imagePath = "d:/Pictures/labview.jpeg";
    // 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

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

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

相关文章

DNS分离解析、多域名解析以及DNS子域试验

一、DNS分离解析 有些时候&#xff0c;对不同网络中的计算机进行DNS解析时&#xff0c;需要进行"区别对待"&#xff0c;不同的主机请求服务器解析相同的域名&#xff0c;得到的IP地址也会不同。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff…

简介有限面积和无限周长

前言 分形理论是一种非常重要的科学概念,它被广泛应用于物理学、数学、生物学等领域。分形理论描述了一种重复自相似的结构,这种结构在不同的尺度上都具有类似的形态。由于分形理论的应用广泛且深远,了解分形理论可以帮助人们更好地理解自然界和人造世界中的现象。 作为一…

docker占用磁盘空间大小排查

首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多 cd /var/lib/docker/overlay2/du -s ./* | sort -rn | more再通过目录名查找容器名 docker ps -q | xargs docker inspect --format {{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}} | gre…

基于Patroni+etcd+流复制搭建PostgreSQL高可用——筑梦之路

Patroni方案简介 Patroni是一个基于zk、etcd、consul等的pg ha模板&#xff0c;可以使用python来创建和定制高可用性解决方案。Patroni使用分布式key-value数据库作为数据存储&#xff0c;主节点故障时进行主节点重新选举。通过PG内置的流复制&#xff0c;支持同步和异步复制。…

java中,怎样用最简单方法实现写word文档

在跨平台环境中实现写word时&#xff0c;如果用现成的库&#xff0c;就会涉及跨平台兼容性问题&#xff0c;比如在安卓与java中实现写word的功能。还有一个问题就是&#xff0c;完全用程序生成word文档&#xff0c;工作量较大。所以采用了模板替换的方法。 docx文档本质就是一…

BUUCTF [GUET-CTF2019]zips 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 得到一个attachment.zip文件 解题思路&#xff1a; 1、解压attachment.zip&#xff0c;得到222.zip文件。尝试解压需要密码&#xff0c;使用Ziperello爆破密码…

C语言学习笔记-- 3.4.2实型变量

1.实型数据在内存中的存放形式&#xff08;了解&#xff09; 实型数据一般占4个字节&#xff08;32位&#xff09;内存空间。按指数形式存储。 2.实型变量的分类&#xff08;掌握&#xff09; 实型变量分为&#xff1a;单精度&#xff08;float型&#xff09;、双精度&#…

在线思维导图编辑!3个AI思维导图生成软件推荐!

思维导图&#xff0c;一种以创新为驱动的视觉化思考工具&#xff0c;已经渗透到我们日常生活和工作的各个角落。当我们需要整理思绪、规划项目或者梳理信息时&#xff0c;思维导图总能提供极大的帮助。 近些年随着云服务等基础设施的完善&#xff0c;我们可以看到越来越多提供…

new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器

demo案例 new CCDIKSolver(OOI.kira, iks); 在使用某个特定的库或框架来创建一个逆运动学&#xff08;Inverse Kinematics, IK&#xff09;求解器实例。逆运动学在机器人学、动画和计算机图形学等领域中非常重要&#xff0c;它用于根据期望的末端执行器&#xff08;如机器人的…

【IOT】OrangePi+HomeAssistant+Yolov5智能家居融合

前言 本文将以OrangePi AIpro为基础&#xff0c;在此基础构建HomeAssistant、YOLO目标检测实现智能家居更加灵活智能的场景实现。 表头表头设备OrangePi AIpro(8T)系统版本Ubuntu 22.04.4 LTSCPU4核64位处理器 AI处理器AI算力AI算力 8TOPS算力接口HDMI2、GPIO接口、Type-C、M.2…

复购率下降是什么原因导致的?三个步骤直击复购率下降根源

在商业运营中&#xff0c;回购率的波动往往能够直观地反映出客户对品牌和产品的忠诚程度。一个健康的回购率可以为企业带来稳定的收入流&#xff0c;同时也是品牌口碑和市场影响力的有力证明。但是&#xff0c;当企业面临回购率下降的情况时&#xff0c;这通常是一个警示信号&a…

c++(六)

c&#xff08;六&#xff09; 多态概念在c中是如何实现多态静态多态&#xff08;绑定&#xff09;动态多态&#xff08;绑定&#xff09; 动态多态的实现原理动态内存分配中遇到的问题 重载、重定义、重写的区别抽象类接口类---抽象类空类对象的内存大小explicitfinal修饰类修饰…

串口调试助手中文乱码 解决方案

输出乱码 一般&#xff0c;当串口调试助手输出乱码时&#xff0c;可能有以下几个原因&#xff1a; 波特率设置错误&#xff1a;串口通信需要保证发送和接收的设备使用相同的波特率。请检查串口调试助手和目标设备的波特率设置是否一致。 数据位、停止位或校验位设置错误&…

java Web开发中采用Servlet登录验证,中文用户名始终提示“用户名密码错误”以及输出中文乱码问题

采用Servlet登录验证&#xff0c;中文乱码问题解决 在Java Web开发中&#xff0c;往往采用Servlet完成前后端直接的控制和处理&#xff0c;例如&#xff1a;用户登录验证功能。 在采用如下Servle源码t完成用户名登录验证时&#xff0c;只要用户名涉及中文&#xff0c;对于正确…

kafka-偏移量图解

生产者偏移量&#xff1a;生产者发送消息时写入到哪个位置&#xff08;主题的每个分区会存储一个 leo 即将写入消息的偏移量&#xff09;&#xff0c;每次写完消息 leo 会 1 消费者偏移量&#xff1a;消费者从哪个位置开始消费消息&#xff0c;小于等于 leo&#xff0c;每个组…

电脑怎么清理c盘垃圾文件 电脑运行内存不足怎么清理

和Windows系统电脑文件分区不同&#xff0c;苹果电脑并不分区&#xff0c;默认只有C盘&#xff0c;当C盘垃圾文件过多&#xff0c;电脑运行内存不足时&#xff0c;手动清理电脑垃圾文件毫无头绪&#xff0c;可以尝试使用苹果电脑清理软件——CleanMyMac来清理 。 一、电脑怎么…

Stable Diffusion WebUI详细使用指南

Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…

618局外人抖音:别人挤压商家“拼价格”,它默默联合商家“抢用户”?

文&#xff5c;新熔财经 作者&#xff5c;宏一 “618”来临之际&#xff0c;各电商平台和短视频平台早已打响了“促销大战”。不过&#xff0c;今年各大平台都更积极适应新的消费形式&#xff0c;调整了“大促动作”。 比如淘宝、京东带头取消了沿用十年之久的预售机制&…

【JS红宝书学习笔记】第4章 变量、作用域和内存

第4章 变量、作用域和内存 1. 原始值和引用值&#xff08;面试题&#xff09; ECMAScript 变量可以包含两种不同类型的数据&#xff1a;原始值和引用值。原始值&#xff08;primitive value&#xff09;就是最简单的数据&#xff08;Undefined、Null、Boolean、Number、Strin…

windows上安装miniforge和jupyterlab

1&#xff0c;下载miniforge3 GitHub - conda-forge/miniforge: A conda-forge distribution. 下载下来后傻瓜式安装就可以了 配置环境变量&#xff0c;在系统环境变量的path添加下列就行了&#xff0c;根据自己的路径修改 2&#xff0c;创建虚拟环境 conda create -n test …