QSqlDatabase在Debug中工作正常但不是Release(需要QCoreApplication)

时间:2013-05-16 19:16:07

标签: qt

我有一个使用QS使用QSqlDatabase在Qt中使用SQLite的应用程序,如果我在调试模式下编译,一切正常。我的问题是,当我切换到发布模式时,没有任何作用。我的第一个错误似乎与引入QtCore4.dll和QtGui4.dll文件的代码有关。一旦我将这些文件移动到与编译代码相同的目录中,程序就会加载,但是以下错误被写入Qt Creator控制台:

  

QSqlDatabase:未加载QSQLITE驱动程序

     

QSqlDatabase:可用的驱动程序:

     

QSqlDatabase:加载驱动程序插件需要一个QCoreApplication实例

我认为这可能是唯一的一条就是我只是在顶部使它成为全球性的:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

我的PRO文件如下:

QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = LessonsLearned
TEMPLATE = app


SOURCES += main.cpp\
        lessonslearned.cpp

HEADERS  += lessonslearned.h

FORMS    += lessonslearned.ui

我甚至尝试重新安装Qt,看看是否能解决问题。

重申一下......如果编译Debug,一切正常。它解决了问题。

我正在使用Qt 4.7.3和Visual Studio 2008,以防出现可能导致问题的某种原因。

更新

我已经在类的头文件中移动了“QSqlDatabase db”的声明,并将其作为私有。我还将addDatabase(“QSQLITE”)的调用移到了构造函数:

LessonsLearned::LessonsLearned(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LessonsLearned)
{
    ui->setupUi(this);

    db = QSqlDatabase::addDatabase("QSQLITE");
}

这使得需要QCoreApplication的错误消失了,但我仍然得到前两条消息。仍然适用于Debug但不适用于Release。我想知道程序是否仍然指向某个错误的DLL。我已经尝试了更多的依赖步行者,但我还是找不到那个错误的人。

更新2 我在这里找到了一些有用的东西:QSQLITE driver not loaded - where to put qt database driver plugins。我认为这与我的问题相同。我仍然不知道为什么我必须修改Release目录以添加sqldrivers文件夹,但它可以工作。

2 个答案:

答案 0 :(得分:3)

对于发布问题:

如果让QtCode4.dllQtGui4.dll解决了一些问题,那么可能会带来qsqlite4.dll来解决剩下的问题。请注意,您必须将其放在可执行文件附近名为sqldrivers的文件夹中。

答案 1 :(得分:1)

可能你的问题是你有一个全局变量:     QSqlDatabase db = QSqlDatabase :: addDatabase(“QSQLITE”); 这意味着addDatabase()将在main()之前调用,这意味着在创建QCoreApplication对象之前。

所以你只能在创建QCoreApplication对象之后调用addDatabase()(这通常是main()中的第一个东西)。

避免使用全局变量,特别是那些具有复杂类型的变量,甚至更多那些调用函数的变量。

我不知道为什么你只能在发布模式下解决问题。