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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19062.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch 星號*放在tensor前的作用

假如有一個多維tensor&#xff0c;名為id&#xff0c;那么*id的意思是什么呢&#xff1f; GPT答&#xff1a; 如果 id 是一個多維張量&#xff0c;那么 *id 在這種情況下會將這個多維張量解包成一個張量序列&#xff0c;其中每個元素都是一個更低維度的張量。具體來說&#x…

圖形學初識--空間變換

文章目錄 前言正文矩陣和向量相乘二維變換1、縮放2、旋轉3、平移4、齊次坐標下總結 三維變換1、縮放2、平移3、旋轉繞X軸旋轉&#xff1a;繞Z軸旋轉&#xff1a;繞Y軸旋轉&#xff1a; 結尾&#xff1a;喜歡的小伙伴可以點點關注贊哦 前言 前面章節補充了一下基本的線性代數中…

前端Vue小兔鮮兒電商項目實戰Day02

一、Pinia快速入門 此處見&#xff1a;Vue從入門到實戰Day12-CSDN博客 二、創建項目并精細化配置 1. 創建項目 2. src目錄調整 ①刪除一些初始化的默認文件 清空assets、components、store、views文件夾下的內容&#xff1b; ②修改剩余代碼內容 router/index.js import …

一個程序員的牢獄生涯(44)詢問

星期一 詢 問 在號子里開始了下午坐班的時候,過道內的大鐵柵欄被管教打開,我聽到開鎖的聲音后,心里變得激動起來。盼望著腳步聲能停在我們的號子門口,然后打開鐵門,喊一聲“眼鏡,出來!”。 通道內這次進來的是秦所,但他并沒有在我們號子門口停留,只是在走過的時候,低…

華為昇騰310 ATC模型轉換工具安裝

參考: https://bbs.huaweicloud.com/blogs/393282?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0004.html 1、基本工具…

js知識點之閉包

閉包 什么是閉包 閉包&#xff0c;是 JavaScript 中一個非常重要的知識點&#xff0c;也是我們前端面試中較高幾率被問到的知識點之一。 打開《JavaScript 高級程序設計》和《 JavaScript 權威指南》&#xff0c;會發現里面針對閉包的解釋各執一詞&#xff0c;在網絡上搜索關…

Java中如何指定jdk的版本運行jar包

你的jdk安裝的目錄\bin\java -jar 你的jar包名字.jar 這是我的代碼示例 C:\Users\86177\.jdks\corretto-17.0.10\bin\java -jar big_event_study2-0.0.1- SNAPSHOT.jar

23種設計模式之一— — — —裝飾模式詳細介紹與講解

裝飾模式詳細講解 一、定義二、裝飾模式結構核心思想模式角色模式的UML類圖應用場景模式優點模式缺點 實例演示圖示代碼演示運行結果 一、定義 裝飾模式&#xff08;別名&#xff1a;包裝器&#xff09; 裝飾模式&#xff08;Decorator Pattern&#xff09;是結構型的設計模式…

LeetCode 每日一題 數學篇 2651.計算列車到站時間

給你一個正整數 arrivalTime 表示列車正點到站的時間&#xff08;單位&#xff1a;小時&#xff09;&#xff0c;另給你一個正整數 delayedTime 表示列車延誤的小時數。 返回列車實際到站的時間。 注意&#xff0c;該問題中的時間采用 24 小時制。 int findDelayedArrivalTi…

學業輔導導師:文心一言智能體詳細介紹和開發

一、前言 本期題目 開發方向&#xff1a;學習成長類 解讀&#xff1a; AI技術在學習成長方向的應用正日益增多&#xff0c;本期賽題需圍繞該方向開發智能體包括但不限于:作文輔導助手、個性化學習助手、考試助手、各垂類教育內容專家等 二、我的智能體&#xff1a;學業輔導…

macbook中foxmail的通訊錄遷移

之前windows中用習慣了foxmail,換成macbook后,還是沿用foxmail。使用一段時間后,確實受不了foxmail的不便:1、版本比較低1.5.6,很多windows新版的功能都沒有;2、動不動莫名其妙崩潰,寫了半天的郵件,點擊發送就直接崩了,又得重新寫。 忍耐了幾個月后,下定決心換成網易…

2.10 mysql設置遠程訪問權限

2.10 mysql設置遠程訪問權限 目錄1. 管理員運行mysql命令窗口2. 使用 root 用戶重新登錄 MySQL3. 修改用戶權限4. 修改mysql安裝目錄下的my.ini 目錄 說明&#xff1a; Mysql8.0 設置遠程訪問權限 一、Mysql8.0 設置遠程訪問權限 1. 管理員運行mysql命令窗口 2. 使用 root 用…

matlab安裝及破解

一、如何下載 軟件下載鏈接&#xff0c;密碼&#xff1a;98ai 本來我想自己生成一個永久百度網盤鏈接的&#xff0c;但是&#xff1a; 等不住了&#xff0c;所以大家就用上面的鏈接吧。 二、下載花絮 百度網盤下載速度比上載速度還慢&#xff0c;我給充了個會員&#xff0c…

【1】:計算機圖形學概述

從技術角度講&#xff0c;什么是好的畫面呢&#xff1f; 看這個畫面是不是足夠亮&#xff0c;也就是全局光照做的夠好 什么是計算機圖形學? 使用計算機合成和操作可視信息。 應用場景 Video Games 游戲 Movie 電影 Animation 動畫 Design 設計&#xff1a;CAD等軟件相關…

修復CentOS 6.6服務器YUM和RPM功能異常的技術實踐20240523

修復CentOS 6.6服務器YUM和RPM功能異常的技術實踐 引言 在復雜的生產環境中&#xff0c;服務器的穩定性至關重要。近期&#xff0c;我們遇到了一臺CentOS 6.6服務器在執行yum update -y時被中斷&#xff0c;導致YUM和RPM功能異常的問題。本文將詳細介紹問題的診斷、解決過程以及…

java中變量名單獨占用一個空間嗎,為什么能直接使用變量名而不需要給java地址,變量名和地址之間有什么關系

在 Java 中&#xff0c;變量名不單獨占用存儲空間&#xff0c;但它們確實在內存中有對應的地址。為了理解這一點&#xff0c;我們需要深入了解變量名和內存地址之間的關系。 變量名與內存地址 變量名的作用: 在 Java 程序中&#xff0c;變量名是用于引用存儲在內存中的數據的…

git顯示提交次數

git shortlog 是一個特殊版本的 git log 命令&#xff0c;旨在創建發布公告。它將每個提交按作者分組&#xff0c;并顯示每個提交消息的第一行。這是一種快速查看不同作者在項目中的貢獻的方式。 以下是 git shortlog 的一些常用參數&#xff1a; -n 或 --numbered&#xff1…

Java多線程——Lambda表達式

λ希臘字母表中排序第十一位的字母&#xff0c;英語名稱為Lambda&#xff1b; 避免匿名內部類定義過多&#xff1b; 其實質屬于函數式編程的概念。 為什么要用Lambda表達式&#xff1f; 1. 避免匿名內部類定義過多&#xff1b; 2. 可以讓你的代碼看起來更簡潔&#xff1b; …

OpenAI 文生圖模型演進:DDPM、IDDPM、ADM、GLIDE、DALL-E 2、DALL-E 3

節前&#xff0c;我們星球組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、參加社招和校招面試的同學。 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 合集&#x…

WPF使用Prism實現簡單訂餐系統

新建wpf項目&#xff0c;nuget引入Prism.DryIoc&#xff0c;MaterialDesignThemes 引入后&#xff0c;修改App.xaml 前臺引入 xmlns:prism"http://prismlibrary.com/"和prism:PrismApplication App.xaml.cs App.xaml.cs繼承PrismApplication&#xff0c;重寫CreateS…