Qt6.9手动编译和配置MySQL数据库驱动插件(Qt creator+MinGW)

注:本文配置的是Qt creator+MinGW的MySQL数据库驱动,VS+MSVC会在笔者博客后续文章发出。

Qt6.9要想使用官方的数据库驱动,需要手动进行编译,至于官方为什么没有直接编译好给用户使用,以下给出几点网上搜索的原因,简单来说就是MySQL版本太多了,而版本不一样对外的dll接口文件就不一样,所以干脆开放出来给用户自己去编译和配置,这样就比较灵活。

1.依赖问题:
MySQL 驱动依赖于 MySQL 客户端库(如 libmysql.dll 等)。不同的操作系统和系统环境中,MySQL 客户端库的版本和配置可能不同。为了确保兼容性,官方很难针对所有可能的 MySQL 环境预编译出通用的驱动。用户自行编译可以根据自己实际安装的 MySQL 版本和环境来配置,从而保证驱动与本地 MySQL 服务的兼容性。

2.动态更新与定制性:
不同用户使用的 MySQL 版本和配置可能存在差异,自行编译驱动可以根据实际情况灵活调整编译选项。例如,有些用户可能使用的是 MySQL 的最新版本,有些则使用旧版本,官方预编译的驱动可能无法适配所有版本。用户自行编译能够保证驱动与自己使用的 MySQL 数据库版本完全匹配,还可以根据需求开启或关闭某些特性。

整个过程写的非常详细,完全适合零基础小白。

一、准备工作

1.安装和配置好的MySQL。我的版本是8.4.6 LTS,如果不知道怎么安装和配置MySQL可以看看笔者前面的文章:Windows系统MySQL数据库安装、配置和基本使用-CSDN博客

2.Qt creator。我的版本是17.0.0社区版。

二、开始配置前的测试

在开始配之前进行此步的目的是:1.测试和验证当前Qt版本可用驱动列表里面没有QMYSQL驱动,且确实连接不到数据库。2.配置完成后再通过此测试项目测试即可验证配置成功。

2.1创建项目

打开Qt creator新建一个Qt Widgets Application项目,基类选择QMainWindow。

构建套件选择MinGW,因为我们配置的就是MinGW的MySQL驱动,此处当然要选MinGW构建测试项目。

2.2编写测试代码

2.2.1添加数据库模块的引用

打开项目的.pro文件引入数据库模块,在Qt后面空格隔开追加一个sql即可。

2.2.2在mainwindow.h头文件申明一个连接MySQL的方法。

注意添加头文件。这里就三行代码就不给出具体代码了。

2.2.3在mainwindow.cpp文件添加上述连接MySQL方法的实现。

代码附在图片后面。

#include <QMessageBox>
#include <qsqlerror.h>//注意添加这两个头文件


void MainWindow::connectMySQL()
{
    //打印当前Qt中可用的数据库驱动。
    qDebug() << "\n\n";
    qDebug() << "There are all can being used DRIVERS:";
    qDebug() << QSqlDatabase::drivers()<<"\n\n";

    //连接数据库
    base = QSqlDatabase::addDatabase("QMYSQL", "main");//区分大小写的
    base.setDatabaseName("qt_qq_main");//要连接的数据库名称
    base.setHostName("localHost");//主机名称
    base.setUserName("root");//用户名
    base.setPassword("192412");//密码
    base.setPort(3306);//端口号
    if (base.open())
    {
        QMessageBox::information(nullptr, "Tip", "Successed to opened database!",QMessageBox::Yes);
    }
    else
    {
        QMessageBox::information(nullptr, "Tip", "Failed to opened database!",QMessageBox::Cancel);
        qDebug() << base.lastError().text();//将错误信息传递出来
    }
}

2.2.4调用数据库连接方法。

在mainwindow.cpp的构造函数中调用。

2.2.5运行

运行代码,在应用程序输出页会看到以下输出,前面部分第二行打印了当前所有可用的驱动,可以发现没有我们需要的QMYSQL驱动。最后一行打印了打开数据库连接的报错:不能加载所需的驱动,可用的只有后面给出的这几个也就是第二行的所有驱动。这就是我们为什么手动编译和配置这个驱动,因为没有,没嘚用。

三、在Qt creator下载驱动配置源码。

打开Qt creator的工具->Qt Maintenance Tool->Start Maintenance Tool

登录后,选择添加或移除组件。

在Qt->Qt 6.9.1下勾选Sources,随后等待下载完成即可。

下载完成后,打开Qt的安装目录->6.9.1文件夹下可以发现多了一个文件夹Src,这里面就有我们需要的驱动配置源码。(注:目录的6.9.1对应你的Qt版本,我的Qt版本是6.9.1所以这里就是6.9.1文件夹)。

四、编译驱动源码

为了不对源码做任何修改,我们将需要的源码复制出来做修改和编译,生成我们需要的dll文件。

4.1创建一个要用来编译的文件夹。

这里可以直接和我一样在前面的Src文件夹下创建一个文件夹plugins_Setting,意为驱动配置,这里的名字自己起无所谓的,文件夹放在哪里也无所谓。

在plugins_Setting文件夹下再创建两个文件夹,一个用来存放待会要复制过来的驱动相关的源码,另一个存放从MySQL安装目录复制过来的库文件和头文件。

4.2将驱动相关源码复制过来。

复制Src下面的qtbase一整个文件夹到我们自己创建的驱动源码文件夹plugins_source。

4.3将MySQL库文件和头文件复制过来

打开你的MySQL安装目录,一起复制include文件夹和lib文件夹到我们之前创建的存放MySQL相关文件的文件夹MySQL_lib。至此所有需要的文件已经准备完毕,下面就可以开始编译了。

为了防止读者对文件的存放位置不清晰我给出一个文件结构图,文件名称都写的我的命名。

4.4编译

4.1.1打开源码

找到下图目录中的CMakeLists.txt,右键选择打开方式,以Qt creator打开。

4.4.2项目设置

选择MinGW,因为我们要配置的就是Qt creator+MinGW使用的MySQL驱动。

4.4.3修改配置文件

打开.cmake.conf配置文件输入以下配置代码。

SET(FEATURE_sql_mysql ON)
SET(MySQL_INCLUDE_DIR "E:/CodingSoftware/Qt/Re_ZHUANG/6.9.1/plugins_Setting/MySQL_lib/include")
SET(MySQL_LIBRARY "E:/CodingSoftware/Qt/Re_ZHUANG/6.9.1/plugins_Setting/MySQL_lib/lib/libmysql.lib")

注:MySQL_INCLUDE_DIR后面的文件地址是之前复制过来MySQL头文件的地址,MySQL_LIBRARY后面的地址是之前复制过来MySQL的lib文件夹下的libmysql.lib文件地址

4.4.4构建

这里点锤子进行构建,不要点运行!如果构建完成后,在编译输出栏的未报错,且内容与下图大致一致则编译成功。

编译完成后可以发现,在当前项目目录中已经生成了我们需要的dll文件和debug文件。

五、将编译好的dll文件添加到MinGW

5.1添加编译生成的dll文件

将前面生成的dll文件和debug文件添加到MinGW驱动文件夹里面

5.2添加lib文件

找到你的MySQL安装目录下的bin目录里面的libmysql.dll和libmysql.lib文件。

将这两个文件放到Qt安装目录->Qt版本号目录->mingw_60->bin目录里面。

至此,所有的编译和配置都结束了!

六、再次测试

重新打开我们在2.2中编写的测试代码,点击运行,可以发现可用的驱动多出来了我们需要的QMYSQL驱动。

<think>我们正在讨论Qt 6.9.3中foreach的使用方法注意事项。根据Qt的官方文档最佳实践,foreach是Qt提供的一个宏,用于遍历容器。然而,在C++11及以后的标准中,Qt更推荐使用基于范围的for循环(range-based for loop),因为它是标准C++的一部分,并且更加高效安全。 首先,我们回顾一下foreach的基本语法: ```cpp foreach (const Type &variable, container) { // 循环体 } ``` 在Qt 6.9.3中,foreach宏仍然可用,但需要注意以下几点: 1. **性能问题**:foreach宏在遍历时会复制容器。如果容器很大,这可能会导致性能下降。而基于范围的for循环则不会复制容器(除非你显式地要求复制)。 2. **容器修改**:在foreach循环中修改容器(如添加或删除元素)可能导致未定义行为。因此,在循环过程中应避免修改容器本身。 3. **C++11标准**:从Qt 5.7开始,Qt官方建议使用C++11的基于范围的for循环替代foreach宏。 4. **宏的潜在问题**:foreach是一个宏,它可能在复杂的作用域中引起问题,比如与变量名冲突等。 因此,在Qt 6.9.3中,推荐使用基于范围的for循环,语法如下: ```cpp for (const auto &variable : container) { // 循环体 } ``` 如果你仍然需要使用foreach,确保包含必要的头文件(在较新的Qt版本中,foreach宏定义在<QtGlobal>中,但通常已经被包含在常用的头文件如<QCoreApplication>中)。 注意事项总结: - 避免在循环中修改容器。 - 对于只读遍历,如果容器很大,考虑使用基于范围的for循环以避免不必要的复制。 - 在Qt 6中,foreach宏仍然可用,但已被标记为过时(deprecated),未来版本可能会移除。 最后,为了代码的现代化可移植性,建议迁移到C++11的基于范围的for循环。 相关问题: 1. 如何在Qt中遍历QList容器? 2.Qt中,foreach基于范围的for循环在性能上有何差异? 3. 在foreach循环中修改容器会导致什么问题? </think>在 Qt 6.9.3 中使用 `foreach` 宏时,需要注意以下要点: ### 使用方法 1. **基本语法**: ```cpp foreach (const Type &variable, container) { // 循环体 } ``` 例如遍历 `QStringList`: ```cpp QStringList fruits = {"Apple", "Banana", "Cherry"}; foreach (const QString &fruit, fruits) { qDebug() << fruit; } ``` 2. **容器类型**: - 支持所有 Qt 容器:`QList`, `QVector`, `QSet`, `QMap` 等 - 支持 STL 容器(需包含 `<QtGlobal>`) ### ⚠️ 重要注意事项 1. **性能影响**: - `foreach` 会创建容器副本(隐式共享),大容器时影响性能 - 推荐改用 C++11 范围循环(不创建副本): ```cpp for (const auto &item : container) { ... } ``` 2. **容器修改风险**: - 循环中修改容器会导致未定义行为 ```cpp // 错误示例(可能崩溃): foreach (int num, numbers) { if (num % 2 == 0) numbers.removeOne(num); // 危险! } ``` 3. **作用域问题**: - `foreach` 宏可能污染外部作用域变量名 ```cpp int x = 10; foreach (int x, list) { ... } // 外部x被覆盖! ``` 4. **Qt 6 兼容性**: - 虽未完全弃用,但官方推荐迁移到 C++11 范围循环[^1] - 使用时需包含 `<QtGlobal>` 5. **数据类型优化**: - 对复杂对象使用常量引用避免拷贝: ```cpp // 推荐 foreach (const BigObject &obj, bigList) ``` ### 迁移建议 ```cpp // 旧版 Qt foreach (QString str, stringList) { ... } // Qt 6.9.3+ 推荐 for (const QString &str : std::as_const(stringList)) { // std::as_const 防止隐式共享 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值