QSqlDatabase::addDatabase奔溃及driver not loaded解决

本文探讨了使用Qt连接PostgreSQL数据库过程中遇到的问题及解决方案,包括因Qt版本与数据库驱动不匹配导致的崩溃,以及连接失败的情况。提供了两种解决方法:设置系统变量QT_PLUGIN_PATH或在代码中指定插件路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.奔溃

如下代码:

#include "QtGuiApplication1.h"
#include "qsqldatabase.h"
#include "qsqlquery.h"
#include "qdebug.h"

QtGuiApplication1::QtGuiApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("postgis_24_sample");
    db.setPort(5432);
    db.setUserName("postgres");
    db.setPassword("admin");
    bool ok = db.open();

    int b = ok;
    QSqlQuery query;
    query.exec("Select * from \"Pipes\"");
    while (query.next())
    {
        QString id = query.value(1).toString();
        qDebug() << id;
    }
}

运行到第11行时会奔溃,排查了好久,原因如下:

     使用的QPSQL数据库驱动和当前编写代码的Qt版本不一致造成的,如:当前用的Qt为Qt 5.14.1,但是第11行加载的数据库驱动qsqlpsql.dll是其它Qt版本的,如:是Qt 5.15.1.当版本不兼容时,有时会崩溃。比如:有时是从其它Qt版本拷贝过来的数据库驱动。数据库驱动一般在Qt安装目录下的  plugins\sqldrivers   目录下。比如我本机是:

C:\Qt_5_12_3\Qt5.12.3\5.12.3\msvc2017\plugins\qldrivers

2.连接失败

第17行即ok返回false,该原因一般是找不到数据库驱动导致,报错如下:

  driver not loaded

用以下代码输出数据库驱动程序为空:

qDebug() << QSqlDatabase::drivers() << "\r\n";

解决方法有两种:

1):新增系统变量QT_PLUGIN_PATH,根据每个人QT系统安装路径进行配置,比如我的系统C:\Qt_5_12_3\Qt5.12.3\5.12.3\msvc2017\plugins。然后重启开发环境,如:重启VS、QtCreator。

2):通过如下代码将数据库驱动程序所在的插件目录加入到库搜索目录中:

QCoreApplication::addLibraryPath(R"(C:\Qt_5_12_3\Qt5.12.3\5.12.3\msvc2017\plugins)");

根据每个人QT系统安装路径进行配置,比如我的系统是:

C:\Qt_5_12_3\Qt5.12.3\5.12.3\msvc2017\plugins

说明:一般都将插件目录(如:C:\Qt_5_12_3\Qt5.12.3\5.12.3\msvc2017\plugins)放到可执行文件同一目录下。最好是在应用程序文件夹下创建 plugins 文件夹,然后到本机上对应Qt版本的安装目录,把sqldrivers目录拷贝到刚创建的plugins文件夹下,然后在main函数中加入如下代码:

QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() +"/plugins");

### 解决方案 QSqlDatabase 中 `QSQLITE driver not loaded` 的问题通常是由于 SQLite 驱动未能正确加载引起的。以下是可能的原因及其对应的解决方案: #### 1. **确认 Qt 版本支持 SQLite** 如果使用的 Qt 编译版本不包含 SQLite 支持,则无法加载 QSQLITE 驱动。可以通过以下方式验证: - 使用命令行工具检查可用驱动列表: ```bash qsqlitedriver --list-drivers ``` - 如果输出中缺少 `QSQLITE`,则说明当前编译的 Qt 不支持 SQLite。 解决方法:重新编译 Qt 并启用 SQLite 支持[^1]。 --- #### 2. **确保插件路径正确** Qt 应用程序需要访问到 SQLite 插件文件(如 Windows 下的 `qsqlite.dll` 或 Linux/MacOS 下的 `libqsqlite.so`)。这些文件通常位于 `<Qt安装目录>/plugins/sqldrivers/` 路径下。 - 如果应用程序运行时找不到该路径下的插件文件,可以尝试手动指定插件路径: ```cpp QString pluginPath = QApplication::applicationDirPath() + "/sqldrivers"; QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); qDebug() << "Plugin Path:" << pluginPath; QCoreApplication::addLibraryPath(pluginPath); ``` - 对于跨平台部署,建议将 `sqldrivers` 文件夹打包并随应用程序一起分发[^4]。 --- #### 3. **静态链接 SQLite 驱动** 对于某些嵌入式环境或特定需求场景,可以选择将 SQLite 驱动静态链接至项目中。具体步骤如下: - 修改 `.pro` 文件以包含 SQLite 模块: ```plaintext QT += sql CONFIG += static ``` - 确保在构建环境中已启用 SQLite 功能,并将其作为静态库集成到最终可执行文件中[^5]。 --- #### 4. **检查工作目录中的动态库依赖** 当使用动态链接库时,需确保目标平台上存在必要的 SQLite 动态库文件(如 `libsqlite3.so` 或 `sqlite3.dll`),并且它们能够被操作系统定位到。 - 可通过工具(如 `ldd` 或 `Dependency Walker`)分析可执行文件的依赖关系。 - 将缺失的动态库复制到应用程序的工作目录或其他标准位置。 --- #### 5. **调试日志辅助排查** 为了进一步诊断问题根源,可以在代码中加入调试语句获取更详细的错误信息: ```cpp #include <QSqlDatabase> #include <QDebug> void checkDrivers() { QStringList drivers = QSqlDatabase::drivers(); qDebug() << "Available Drivers:" << drivers; if (!drivers.contains("QSQLITE")) { qDebug() << "Error: QSQLITE is not available."; } } ``` 上述函数会打印所有可用的数据库驱动名称,便于判断是否成功加载了 QSQLITE 驱动[^2]。 --- ### 总结 综合以上分析可知,`QSqlDatabase: QSQLITE driver not loaded` 错误的主要成因包括但不限于: - 当前 Qt 构建未开启 SQLite 支持; - SQLite 插件路径设置不当; - 工作目录缺乏必要动态库文件; - 静态链接配置有误。 针对不同情况采取相应措施即可有效解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值