尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
6.1Qt中编译数据库驱动
在项目开发过程中如果涉及到数据的存储那么肯定会用到数据库。常用的关系型数据库操作的时候需要使用sql语句有mysql、oracle、sqllite等。在Qt框架中也同样提供了对这些数据库的支持我们使用Qt提供的数据库类就可以在上层使用相同的接口对各种数据库进行操作了非常的nice。关于在程序中连接数据库有很多种处理方式比如odbc、ado等在Qt底层也对数据库的连接进行了封装基于不同的连接方式为我们提供了不同的插件二进制代码在需要的时候被加载表现形式为动态库、静态库。虽然如此但是有一点很杯具在高版本的Qt中官方并没有为我们提供可用的mysql和oralce插件只提供了源代码不能直接使用需要我们基于这些源码自行编译得到对应的动态库静态库之后才能被程序加载从而连接上相应的数据库。由于mysql是我们日常工作和学习中用的最多的一种数据库所以下面为大家讲解一下如何在 Qt 中编译出可用的 MySql 插件。本文演示使用的版本说明1.使用的IDEQtCreator2.Qt 版本5.15.23.数据库版本MySql 8.0.27 - 64bit4.使用的编译套件MinGW - 64bit 或者 MSVC- 64bit关注爱编程的大丙回复827可直接下载MySQL安装包。仅供学习使用在继续向下阅读本文之前需要保证本地的Qt环境已经配置好了如果不知如何操作请参考第1章1.1 Qt入门的2.2 环境变量设置1. 版本的选择在编译MySql插件之前需要先确认一下我们本地使用的 Qt 以及 MySql 版本这一点非常重要主要需要考虑以下两个维度1.1 Qt 和数据库的版本场景1低版本的 Qt 低版本的数据库关于 Qt 的版本本人没有挨个版本依次印证用过的 5.9.3 版本及以前是有 MySql 数据库插件的。低版本的数据库指的是 5.6.x 以及 5.7.x 版本场景2低版本的 Qt 高版本的数据库关于 Qt 的版本本人没有挨个版本依次印证用过的 5.9.3 版本及以前是有 MySql 数据库插件的。高版本的数据库指的是 8.0 及以上版本截稿之前最新版本是 8.0.27场景3高版本的 Qt 低版本的数据库此处高版本的 Qt 指的是 5.9.3 以上的版本不包括Qt6相关版本低版本的数据库指的是 5.6.x 以及 5.7.x 版本场景4高版本的 Qt 高版本的数据库此处高版本的 Qt 指的是 5.9.3 以上的版本不包括Qt6相关版本高版本的数据库指的是 8.0 及以上版本截稿之前最新版本是 8.0.27场景5Qt6 相关版本 数据库在Qt6中编译插件使用的 cmake本文内容不适用于该场景。1.2 Qt 编译套件和数据库的位数2. 准备工作我们在 Qt 中编译 MySql 插件的时候需要用到 MySql 的动态库和头文件所以需要提前把这些需要的库文件准备出来一共有两种方式官方下载安装版的 MySql可以在安装目录中找到库文件和头文件官方下载绿色版的 MySql可以在解压目录中得到需要的库文件和头文件MySQL官方地址有时候好像需要架梯子才能访问https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/建议安装绿色版比较省事儿。2.1 安装版 MySql下载去MySQL官方下载最新版的mysql地址如下https://dev.mysql.com/downloads/installer/https://dev.mysql.com/downloads/installer/目前的最新版本是8.0.27将安装包下载到本地直接安装即可。安装安装 MySql 第一步建议选择自定义安装这样就可以选择安装的版本和设置安装路径了。在向导的第一步选择自定义安装。在向导的第二步需要选择安装的版本官方一共提供了三个稳定版本8.0 、5.7、 5.6这里我们选择安装最新版本。通过截图可以看出在8.0版本中没有提供32位版本只有64位版本。在选择版本的时候此处一定要注意一个细节选择好要安装的版本之后接下来需要设置一下mysql的安装目录此处有第二个细节需要注意修改完mysql的安装目录之后目录名多个单词之间建议不要有空格就可以进行下一步的安装了。接下来的几步直接Next就可以了。该窗口设置无需修改记住mysql数据库使用的默认通信端口是3306就可以了后边几步还是默认Next无需设置。在这个向导窗口需要设置mysql数据库密码在连接数据库的时候需要使用这个密码后边几步还是默认Next无需修改。点击窗口中的Execute安装开始安装数据库。到此为止安装结束剩余几步按照向导提示进行操作就可以了。安装成功之后的本地目录中的内容如下图以下是学习者本人的相关MySQL配置和目录图2.2 绿色版 MySql下载地址https://dev.mysql.com/downloads/mysql/https://dev.mysql.com/downloads/mysql/将下载得到的压缩包解压到本地目录中自己指定即可可以看到如下内容通过对比可以看到安装版和绿色版的 MySql 目录结构是一样的内容其实也一样。2.3 准备 Qt 源码如果想要自己能够编译出 MySql 插件需要有一个前提条件就是在安装 Qt 的时候安装了相关的源码如果没有安装可以通过 Qt 提供的在线工具进行添加此工具是 Qt 自动的无需额外安装高版本 Qt 可以直接使用低版本需要升级或官网下载新版本。准备工作完成之后我们就可以去找自己本地的Qt源码目录了以我为例Qt是安装到了C盘的Qt目录下。到此为止准备工作完成。3. 编译 mysql 插件3.1 打开项目文件根据上面的描述我们已经找到了 Qt 的源码目录打开编译 mysql 插件的项目文件我本地的具体路径如下路径的后边部分都是相同的C:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql第一次打开项目需要选择编译套件根据自身情况选择下面其中一种即可使用MinGW编译套件使用MSVC编译套件在使用QtCreator配置这个项目是时候有一个细节需要注意3.2 修改项目文件项目打开之后修改项目文件mysql.proLIBS指定的本地mysql动态库路径和动态库的名字-L指定库的路径-l指定库的名字不需要写后缀对应的文件全名为libmysql.dll我本地的mysql安装目录是这样滴INCLUDEPATH和DEPENDPATH指定的是本地mysql的头文件目录3.3 修改错误信息配置完毕之后 就可以编译该项目了。在编译输出窗口中可以看到有一条警告信息Cannot read C:/qtsqldrivers-config.pri: No such file or directory这个提示是说没找到那个文件其实这个文件确实也是不存在的因此需要修改一下我们首先需要打开项目中的这个qsqldriverbase.pri文件打开qsqldriverbase.pri文件所在目录通过右键菜单打开文件目录可以看到它和configure.pri在同一个目录中修改完毕之后在编译项目就没有错误了。编译成功注意是编译而不是运行之后我们就得到了该项目生成的库文件库文件的位置在安装 Qt 所在盘符的plugins目录中比如我的Qt装到了C盘那么这个plugins目录就需要去C盘下去找它会自动生成。使用MinGW编译套件使用MSVC编译套件qsqlmysql.dll Release 版本的动态库qsqlmysqld.dll Debug 版本的动态库可以看到在这个目录下生成了动态库和静态库这就是Qt连接MySQL的时候需要的插件默认情况下程序是动态链接的方式加载库文件所以需要的是动态库我们要做的事情是需要把生成的这几个文件拷贝到Qt编译套件对应的目录下需要先找到Qt的安装目录对于我本地而言是这个目录使用MinGW编译套件本地示例目录C:\Qt\5.15.2\mingw81_64\plugins\sqldrivers使用MSVC编译套件本地示例目录C:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers在拷贝的时候需要注意一个细节另外还需要将 MySQL 的动态库拷贝到 Qt 的编译套件目录中先找到MySQL的动态库再找到 Qt 的编译套件目录这里需要找64位的编译套件目录对于我本地电脑而言该目录路径为使用MinGW编译套件本地示例目录C:\Qt\5.15.2\mingw81_64\bin使用MSVC编译套件本地示例目录C:\Qt\5.15.2\msvc2019_64\bin4. 连接数据库4.1 连接 MySQL 的代码项目文件 .pro# 在项目文件中添加数据库模块 sql QT core gui sql源文件#include QSqlDatabase #include QMessageBox #include QSqlDatabase #include QSqlError #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-setupUi(this); QStringList list QSqlDatabase::drivers(); qDebug() list; QSqlDatabase db QSqlDatabase::addDatabase(QMYSQL); if(db.isValid()) { QMessageBox::information(this, conn, ok); } else { QMessageBox::information(this, conn, error); } db.setHostName(127.0.0.1); // 本地连接 db.setPort(3306); // 如果使用的是默认端口可以不设置 db.setUserName(root); // 数据库用户名 db.setPassword(root); // 数据库密码 db.setDatabaseName(mysql); // 数据库名字 if(db.open()) { QMessageBox::information(this, 打开数据库, 数据库打开成功, 可以读写数据了......); } else { QString msg 数据库打开失败: db.lastError().text(); QMessageBox::information(this, 打开数据库, msg); } }在执行上述测试代码的时候要求满足一下几个条件1.测试者本地或者远程服务器上已经部署了 MySQL2.如果是连接 Linux 远程 MySQL 服务器需要确认已经开放了连接权限3.确认 MySQL 的端口默认是 33064.确认数据库的连接用户名和密码用户名默认是 root密码是自己设置的5.对于 MYSQL 数据库而言一个用户名下有多个数据库示例程序中的 mysql 是一个自带的数据库也可以连接自己创建的数据库。在上面的程序中执行这样两句代码QStringList list QSqlDatabase::drivers(); qDebug() list;程序执行打印的信息如下:(QSQLITE, QMARIADB, QMYSQL, QMYSQL3, QODBC, QODBC3, QPSQL, QPSQL7)其中有一个字符串叫做 QMYSQL 这是连接 MySql 数据库需要的驱动的名字如果能够检测到 MySQL 插件就能看到这个字符串如果没有按照前面的步骤编译出这个插件放到指定目录则看不到这个驱动名自然也无法连接 MySql 数据库。4.2 遇到的问题MySql 8.0 之前的版本对于 MySql 8.0 之前的版本做到这一步就结束了可以成功连接到 MySql 数据库大功告成。MySql 8.0 及之后的版本对于MySql 8.0 之后的版本提高了客户端和服务器数据通信的安全性也就是说对通信数据做了加密所以还需要依赖一些其他的动态库否则程序是无法运行的会提示驱动无法被加载提示信息如下QSqlDatabase: QMYSQL driver not loaded或者4.3 解决方案关于上述问题的原因已经给大家介绍清楚了就是缺少安全模块的动态库其实这个库文件就是 openssl 的动态库我们无需自己安装官方是有提供的。首先打开官网下载地址https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/下载使用C连接数据库需要的组件建议下载和本地 mysql 动态库一致的版本可以根据自己的实际需求选择安装版或者绿色版以及32bit或64bit。安装或解压完毕之后我们就可以得到这样一个目录进入到lib64目录:目录中的libcrypto-1_1-x64.dll和libssl-1_1-x64.dll就是我们需要的动态库把这两个动态库拷贝到和连接数据库的可执行程序同一级目录中就可以了。使用MinGW编译套件1.直接启动可执行程序连接数据库找到测试程序对应的build目录在进入到可执行程序所在的debug或者release目录把上面找到的两个动态库拷贝到这里就可以了。2.在QtCreator中启动程序连接数据库如果是通过QtCreator启动可执行程序测试数据库的连接那么这两个动态库需要放到build中而不是和可执行程序放到一起这一点我们必须要了解。使用MSVC编译套件如果使用的是 VS 的编译套件我们只需要把两个动态库拷贝到项目的build目录下就可以了这个比较省事儿。按照上述步骤操作完毕之后我们就可以成功连接MySQL数据库了
RELATED

相关推荐

C# 异步编程模式全面探索

C# 异步编程模式全面探索

C# 异步编程模式全面探索 C# 的异步编程经历了三代演进,最终形成了以 Task-based Asynchronous Pattern(TAP) 为核心、async/await 为语法糖的现代模式。下面从历史到现代、从使用到底层原理,系统讲解。 1. 异步编程的三代模式 模式 全称 时代 特点 示例 APM Asynchronou…

📅 2026/10/27 13:32:19
C# `await foreach` 状态机深入分析

C# `await foreach` 状态机深入分析

C# await foreach 状态机深入分析 await foreach 是 C# 8 引入的异步流(Async Stream)语法,用于遍历 IAsyncEnumerable<T>。它同样由编译器转换成状态机,但比普通 async 方法的状态机更复杂,因为它要同时处理异步迭代和异步方法暂停两套机制。 1. 基本语法与接口 …

📅 2026/10/10 0:35:03
Uber自动驾驶致命事故深度剖析:从感知到决策的算法安全鸿沟

Uber自动驾驶致命事故深度剖析:从感知到决策的算法安全鸿沟

1. 事故背景与核心问题&#xff1a;一次本可避免的碰撞2018年3月的一个夜晚&#xff0c;美国亚利桑那州坦佩市&#xff0c;一辆正在进行自动驾驶测试的Uber改装沃尔沃XC90&#xff0c;在昏暗的灯光下撞上了一名推着自行车横穿马路的行人&#xff0c;导致其不幸身亡。这起事件震…

📅 2026/10/8 9:50:33
MORE NEWS

更多资讯

📰

Ponytail插件实战:任务聚合与钩子编排的轻量级配置指南

"ponytail"这个词我一开始也以为搜错了。搜出来满屏都是发型教程、健身动作&#xff0c;甚至还有卖发圈的——直到我意识到&#xff0c;自己真正要找的是一个轻量级的"束拢"工具&#xff0c;它能把一堆零散的任务、脚本、资源统一收口成一个可配置的入口。…

📰

LLaMA-Factory指令增量微调:LoRA配置与防遗忘实战

1. 先搞清楚"指令增量微调"到底在调什么LLaMA-Factory 的指令增量微调&#xff0c;说白了就是&#xff1a;你手上已经有一个能对话的底座模型&#xff0c;它可能已经训过一轮指令&#xff0c;但在你的业务场景里表现得像个刚入职的实习生——答得挺流畅&#xff0c;就…

📰

ITIL4知识管理实战:从信息孤岛到智慧运维

1. ITIL4知识管理实战&#xff1a;从信息孤岛到智慧运维的蜕变之路 在数字化转型浪潮中&#xff0c;运维团队常常面临这样的困境&#xff1a;故障处理经验散落在个人电脑里&#xff0c;解决方案重复发明轮子&#xff0c;新员工入职半年还在摸索基础问题。我们团队通过实施ITIL4…

📰

Pretext排版引擎:技术文档高效处理与多格式输出方案

1. Pretext排版引擎的核心价值解析 Pretext作为新一代专业排版解决方案&#xff0c;其设计理念源于对学术出版和复杂文档处理的深度理解。我在技术文档编排领域工作多年&#xff0c;见证过从LaTeX到CSS Paged Media的各种方案迭代&#xff0c;而Pretext的出现确实解决了几个行…

📰

Agent-Reach框架:多智能体通信、能力注册与路由治理实践

Agent-Reach 这个名字我第一次跟团队提出来的时候&#xff0c;被问得最多的一句话是&#xff1a;这不就是一个消息队列加一个服务注册中心吗&#xff1f;说实话&#xff0c;乍一看确实像&#xff0c;但等真把几个带工具的 Agent 丢到生产环境、让它们在同一个复杂任务里互相调用…

📰

YOLO目标检测中的数据增强策略与实战优化

1. 项目概述在目标检测领域&#xff0c;YOLO系列算法因其出色的实时性和准确性广受欢迎。但很多开发者在实际训练过程中常遇到模型泛化能力不足的问题——在训练集上表现良好&#xff0c;遇到新场景却大幅下降。这往往源于训练数据的多样性和质量不足。数据增强技术正是解决这一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬