QT的mysql(数据库)最佳实践和常见问题解答
涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便

QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件:
- 您需要安装MySQL的客户端库和开发头文件,这些文件通常随MySQL的安装程序一起提供,或者可以从MySQL官网下载。请注意,您需要根据您的Qt架构(32位或64位)选择正确的数据库库文件。
- 您需要获取Qt的源代码,这些代码可以从Qt官网下载。您可以选择与您的Qt版本相匹配的源代码,也可以选择最新的源代码。
- 您需要使用qmake和make工具来编译QMysql驱动,这些工具通常随Qt的安装程序一起提供,或者可以从Qt官网下载。请注意,您需要根据您的操作系统和编译器选择正确的工具。
由于现在版本的QT的Qmysql在安装的时候没有,需要自行去编译这个dll文件出来。
编译出QMysql的相关dll文件的步骤如下:
- 打开Qt命令提示符,进入Qt源代码目录下的qt/src/plugins/sqldrivers/mysql文件夹,例如:
F:\QT\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql
然后把下面这一行代码注释掉:并且配置mysql的地址,如下面所示:

Copy
- 运行qmake命令,指定MySQL的头文件和库文件的路径,例如:
INCLUDEPATH += "E:/mysql/mysql-5.7.27-winx64/include"
DEPENDPATH += "E:/mysql/mysql-5.7.27-winx64/include"
LIBS += "E:/mysql/mysql-5.7.27-winx64/lib/libmysql.lib"
DESTDIR = ../mysql/mylib
Copy
- 运行make或mingw32-make命令,根据您的编译器类型(如果是在VS环境下使用sql,那么就只需要在VS的编译器下面进行编译)选择合适的命令,例如:
mingw32-make
Copy
- 如果编译成功,您将在当前目录下看到一个名为qsqlmysql.dll的文件,这就是QMysql插件。您需要将这个文件复制到您运行Qt应用程序时使用的Qt目录下的qt/plugins/sqldrivers文件夹中,例如:
F:\QT\5.12.9\msvc2017_64\plugins\sqldrivers


以上就是我们的准备工作:
然后就是如何在QT里面使用Qmysql功能;首先,咱们需要先引入头文件,文件如下:
#include <QtSql/QSqlDatabase> // 连接数据库
#include <QtSql/QSqlError> // 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery> // 数据库操作(增删改查)
#include <QSqlQueryModel>
我定义了一下函数名,用来在cpp文件里面写入:
Q_OBJECT
public:mysql(QWidget *parent);~mysql();void insert(QString InserName,int id,QString symbol,QString value);void insert_line(QString InserName,QString id,QString symbol,QString value,QString v,QString despoitory);void data_connect(bool,bool);//连接数据库void data_test_connect(QStringList);//测试能否成功连接数据库void close_data();void creat_table(QString TableName);//创建一个表void update_table(QString InserName,QString id,QString key,QString value);//更新数据库void delete_table(QString TableName,QString id);//删除数据库void find_alltable(QString datebase);//查找所有数据路表格void find_table_inf(QString TableName);//查询某个表中的数据void find_table_row(QString TableName,QString row_name,QString col_name);//查询表中某一行的数据void find_table_col(QString TableName,QString col_name);//表名,列名void find_table_desposite(QString TableName,QString col_name);//表名,列名查询储位名
对应的函数名里面,实现的功能如下所示:
首先是连接数据库部分功能
QSettings *myini=new QSettings("info.ini", QSettings::IniFormat);//构造QSettings对象,访问ini文件QStringList info_digitial={"digitial_type","hostname","port","database_name","user_name","password"};QStringList s;//设置键值对s.clear();myini->beginGroup("digital");for(int i=0;i<info_digitial.size();i++){s.append(myini->value(info_digitial[i]).toString());}myini->endGroup();delete myini;//输出可用数据库qDebug()<<"available drivers:";QStringList drivers = QSqlDatabase::drivers();foreach(QString driver, drivers)qDebug()<<driver;//输出中含有MySQL,那么恭喜你说明你的qt有MySQL驱动了QSqlDatabase db = QSqlDatabase::addDatabase(s[0]);db.setHostName(s[1]);db.setPort(s[2].toInt());db.setDatabaseName(s[3]);//数据库名db.setUserName(s[4]);//用户名db.setPassword(s[5]);//密码bool ok = db.open();//打开并连接数据库if(message_prompt){if (ok){QMessageBox::information(this, "infor", "success connect");}else {QMessageBox::information(this, "infor", "open failed");qDebug()<<"error open database because"<<db.lastError().text();}}
我这里是通过读取ini文件里面存储的信息,来获得数据库的设置,主要包含有:

定义一个QSqlDatabase 对象db,实例化它,如果能够成功connect,则会返回一个布尔值,在这里我通过这个bool值来判断,是否成功连接上数据库了。
然后就是在数据库里面创建一个table,并且想里面插入值:
QSqlQuery query;QString sql=QString("create table %1(订单号 text, 料号 text, 品名 text, 数量 text,储位 text);").arg(TableName);//"订单号","料号","品名","数量"qDebug()<<"SQL"<<sql;//创建表是否成功if (!query.exec(sql))//.exec(),作用是开启一个循环,执行一个事件,相当于while(1){qDebug() << QString::fromLocal8Bit("creat table failed:") << query.lastError();}else{qDebug() << QString::fromLocal8Bit("creat table success!");}
在表table里面插入数据的功能实现如下所示:
QSqlQuery query;QString str=QString("insert into %4(序号,标签,value) values(%1,'%2','%3')").arg(id).arg(symbol).arg(value).arg(InserName);if(query.exec(str)==false){qDebug() << "insert failed";QMessageBox::warning(this,u8"数据插入错误",u8"请检查数据是否正确");}else{QMessageBox::information(this, "insert", "insert connect");qDebug() <<"insert success";}
更新数据的功能实现,代码部分如下所示:
QSqlQuery query;QString updata = QString("update %1 set %2='%3' where 订单号='%4'").arg(InserName).arg(column).arg(value).arg(row);qDebug()<<"--update--"<<updata;if (!query.exec(updata)){qDebug() << QString::fromLocal8Bit("updata failed!") << query.lastError();}else{qDebug() << QString::fromLocal8Bit("updata success!");}
前面我们提了如何创建数据库的table和插入数据的功能实现,下面我们就谈一谈这个数据库的删除功能的视线,代码部分,如下所示:
QSqlQuery query;QString sql = QString("delete from %1 where 订单号 = '%2'").arg(TableName).arg(id);if(query.exec(sql)){qDebug()<<"delete success!";}else{qDebug()<<"delete failed!";}
相关文章:
QT的mysql(数据库)最佳实践和常见问题解答
涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件: 您需要安装MySQL的客户端库和开发头文件…...
使用PyMuPDF库的PDF合并和分拆程序
PDF工具应用程序是一个使用wxPython和PyMuPDF库编写的简单工具,用于合并和分拆PDF文件。它提供了一个用户友好的图形界面,允许用户选择源文件夹和目标文件夹,并对PDF文件进行操作。 C:\pythoncode\blog\pdfmergandsplit.py 功能特点 选择文…...
Data Abstract for .NET and Delphi Crack
Data Abstract for .NET and Delphi Crack .NET和Delphi的数据摘要是一套或RAD工具,用于在.NET、Delphi和Mono中编写多层解决方案。NET和Delphi的数据摘要是一个套件,包括RemObjects.NET和Delphi版本的数据摘要。RemObjects Data Abstract允许您创建访问…...
Eclipse集成MapStruct
Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装(JDK8用到) ②添加到pom.xml 今天拿到同事其他项目的源码,导入并运行的时候抛出了异…...
采用pycharm在虚拟环境使用pyinstaller打包python程序
一年多以前,我写过一篇博客描述了如何虚拟环境打包,这一次有所不同,直接用IDE pycharm构成虚拟环境并运行pyinstaller打包 之前的博文: 虚拟环境venu使用pyinstaller打包python程序_伊玛目的门徒的博客-CSDN博客 第一步…...
Rx.NET in Action 中文介绍 前言及序言
Rx 处理器目录 (Catalog of Rx operators) 目标可选方式Rx 处理器(Operator)创建 Observable Creating Observables直接创建 By explicit logicCreate Defer根据范围创建 By specificationRangeRepeatGenerateTimerInterval Return使用预设 Predefined primitivesThrow …...
Azure Blob存储使用
创建存储账户,性能选择标准即可,冗余选择本地冗余存储即可 容器选择类别选择专用即可 可以上传文件到blob中 打开文件可以看到文件的访问路径 4.编辑中可以修改文件 复制链接,尝试访问,可以看到没有办法访问,因为创建容器的时候选…...
mysql、redis面试题
mysql 相关 1、数据库优化查询方法 外键、索引、联合查询、选择特定字段等等2、简述mysql和redis区别 redis: 内存型非关系数据库,数据保存在内存中,速度快mysql:关系型数据库,数据保存在磁盘中,检索的话&…...
22、touchGFX学习Model-View-Presenter设计模式
touchGFX采用MVP架构,如下所示: 本文界面如下所示: 本文将实现两个操作: 1、触摸屏点击开关按键实现打印开关显示信息,模拟开关灯效果 2、板载案按键控制触摸屏LED灯的显示和隐藏 一、触摸屏点击开关按键实现打印开…...
Python Opencv实践 - 图像高斯滤波(高斯模糊)
import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols,channels img.shape print(rows,cols,channels)#为图像添加高斯噪声 #使用np.random.normal(loc0.0, scale1.0…...
使用 Qt 生成 Word 和 PDF 文档的详细教程
系列文章目录 文章目录 系列文章目录前言一、安装 Qt二、生成 Word 文档三、生成 PDF 文档四、运行代码并查看结果五、自定义文档内容总结 前言 Qt 是一个跨平台的应用程序开发框架,除了用于创建图形界面应用程序外,还可以用来生成 Word 和 PDF 文档。本…...
ssm+vue校园美食交流系统源码
ssmvue校园美食交流系统源码和论文026 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多商…...
电力系统基础知识(一)—电力系统概述
1、电压 也称作电势差或电位差,是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。其大小等于单位正电荷因受电场力作用从A点移动到B点所做的功,电压的方向规定为从高电位指向低电位。其单位为伏特(V,简称伏),常用单位还有千伏(kV)、毫伏(mV)、微伏(uV…...
spring(15) SpringBoot启动过程
目录 一、过程简介二、过程流程图三、源码分析1、运行 SpringApplication.run() 方法2、确定应用程序类型3、加载所有的初始化器4、加载所有的监听器5、设置程序运行的主类6、开启计时器7、将 java.awt.headless 设置为 true8、获取并启用监听器9、设置应用程序参数10、准备环境…...
耕地单目标语义分割实践——Pytorch网络过程实现理解
一、卷积操作 (一)普通卷积(Convolution) (二)空洞卷积(Atrous Convolution) 根据空洞卷积的定义,显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图&…...
画质提升+带宽优化,小红书音视频团队端云结合超分落地实践
随着视频业务和短视频播放规模不断增长,小红书一直致力于研究:如何在保证提升用户体验质量的同时降低视频带宽成本? 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中,小红书音视频架构视频图像处理算法负责人剑寒向…...
【傅里叶级数与傅里叶变换】数学推导——3、[Part4:傅里叶级数的复数形式] + [Part5:从傅里叶级数推导傅里叶变换] + 总结
文章内容来自DR_CAN关于傅里叶变换的视频,本篇文章提供了一些基础知识点,比如三角函数常用的导数、三角函数换算公式等。 文章全部链接: 基础知识点 Part1:三角函数系的正交性 Part2:T2π的周期函数的傅里叶级数展开 P…...
第二章MyBatis入门程序
入门程序 创建maven程序 导入MyBatis依赖。pom.xml下导入如下依赖 <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependen…...
AgentBench::AI智能体发展的潜在问题(二)
从历史上看,几乎每一种新技术的广泛应用都会在带来新机遇的同时引发很多新问题,AI智能体也不例外。从目前的发展看,AI智能体的发展可能带来的新问题可能包括如下方面: 第二是AI智能体的普及将有可能进一步加剧AI造成的技术性失业。…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
