Qt QSqlDatabase在调试中工作正常,但在发布时不工作(需要QCoreApplication)

Qt QSqlDatabase在调试中工作正常,但在发布时不工作(需要QCoreApplication),qt,Qt,我有一个应用程序,它使用QSqlDatabase在Qt中使用SQLite,如果我在调试模式下编译,一切正常。我的问题是,当我切换到释放模式时,什么都不起作用。我的第一个错误似乎与引入QtCore4.dll和QtGui4.dll文件的代码有关。一旦我将这些文件移动到与编译代码相同的目录中,程序就会加载,但以下错误会写入Qt Creator控制台: QSQLDABASE:未加载QSQLITE驱动程序 QSqlDatabase:可用驱动程序: QSqlDatabase:加载驱动程序插件需要QCoreA

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

QSQLDABASE:未加载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,看看这是否解决了问题

重申一下……如果我编译调试,一切都会很好。问题的出现正是因为这个原因

我正在使用Qt4.7.3和VisualStudio2008,以防有某种原因可能导致该问题

更新

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

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

    db = QSqlDatabase::addDatabase("QSQLITE");
}
这使得需要QCoreApplication的错误出现了,但我仍然收到了前两条消息。仍然可以在调试中工作,但不能发布。我想知道程序是否仍然指向某个错误的DLL。我还试了一些,但是我还没有找到一个是错误的

更新2
我在这里发现了一些有用的东西:。我想这和我的问题是一样的。我仍然不知道为什么我必须修改发布目录以添加sqldrivers文件夹,但它可以工作。

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

因此,您只能在创建QCoreApplication对象后调用addDatabase()(这通常是main()中的第一件事)

避免使用全局变量,尤其是那些具有复杂类型的变量,甚至是那些调用函数的变量


我不知道为什么您只在发布模式下遇到问题。

对于发布问题:


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

!我想你需要发布
sqldrivers/qsqlite.dll
,它位于
C:\Qt\Qt5.6.0\5.6\mingw49\u 32\plugins\sqldrivers
好的……我已经将数据库声明作为私有文件移到了头文件中。我还修改了构造函数以调用db.addDatabase(“QSQLITE”)。这确实消除了关于QtCoreApplication的错误(谢谢!),但我仍然收到关于驱动程序未加载和没有可用驱动程序的前两条消息。