2

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 を再インストールしてみました。

繰り返しますが、デバッグをコンパイルすると、すべてが正常に機能します。問題が発生したのはリリースです。

問題を引き起こす可能性のある何らかの理由がある場合に備えて、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 が必要であるというエラーが消えましたが、それでも最初の 2 つのメッセージが表示されます。デバッグでは引き続き機能しますが、リリースでは機能しません。プログラムがまだどこかで間違った DLL を指しているのではないかと思っています。依存関係ウォーカーをもう少し試してみましたが、まだ間違っているものを見つけることができませんでした.

更新 2 ここで役立つものを見つけました: QSQLITE driver not loaded - where to put qt database driver plugins。これは私が抱えていたのと同じ問題だと思います。Release ディレクトリを変更して sqldrivers フォルダーを追加する必要があった理由はまだわかりませんが、機能します。

4

2 に答える 2

3

リリースの問題の場合:

問題のいくつかを持ち込んQtCode4.dllQtGui4.dll解決した場合、おそらくqsqlite4.dll残りの問題を持ち込むことで解決します。sqldrivers実行可能ファイルの近くにある名前のフォルダーに配置する必要があることに注意してください。

于 2013-05-16T20:16:14.003 に答える
2

おそらくあなたの問題は、グローバル変数があることです: QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); これは、addDatabase() が main() の前に呼び出されることを意味します。つまり、QCoreApplication オブジェクトが作成される前です。

そのため、QCoreApplication オブジェクト (通常は main() の最初のものの 1 つ) を作成した後でのみ addDatabase() を呼び出すことができます。

グローバル変数、特に複雑な型を持つものや、関数を呼び出すものは避けてください。

ただし、リリースモードでのみ問題が発生する理由はわかりません。

于 2013-05-16T19:50:34.533 に答える