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数据库了