我有一个使用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文件夹,但它可以工作。
答案 0 :(得分:3)
对于发布问题:
如果让QtCode4.dll
和QtGui4.dll
解决了一些问题,那么可能会带来qsqlite4.dll
来解决剩下的问题。请注意,您必须将其放在可执行文件附近名为sqldrivers
的文件夹中。
答案 1 :(得分:1)
可能你的问题是你有一个全局变量: QSqlDatabase db = QSqlDatabase :: addDatabase(“QSQLITE”); 这意味着addDatabase()将在main()之前调用,这意味着在创建QCoreApplication对象之前。
所以你只能在创建QCoreApplication对象之后调用addDatabase()(这通常是main()中的第一个东西)。
避免使用全局变量,特别是那些具有复杂类型的变量,甚至更多那些调用函数的变量。
我不知道为什么你只能在发布模式下解决问题。