3

私は static クラスを持っていて、それを static にしたいですQSettings。しかし、初期化すると警告が表示されます。

QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);

QCoreApplication::applicationDirPath: 最初に QApplication オブジェクトをインスタンス化してください

QSetting回避策として、メイン関数の開始時に手動で初期化します。静的メンバーを初期化するより良い方法はありますか?

ありがとうございました!

4

2 に答える 2

2

QApplicationから派生しQCoreApplicationます。ソース
からわかるように、次のように定義されています。applicationDirPath

QString QCoreApplication::applicationDirPath()
{
    if (!self) {
        qWarning("QCoreApplication::applicationDirPath: Please instantiate the QApplication object first");
        return QString();
    }

    // ... more code
}

selfコードを深く掘り下げると、関数によって初期化さinitれ、コンストラクターによって呼び出されることがわかります。そのため、クラスのインスタンス (この場合は のインスタンス)
を明示的に作成しない限り、期待どおりに動作しないように見えます。Q*ApplicationQApplication

上記のドキュメントから、そのようなクラスをできるだけ早く作成することが提案されていることに注意してください。

一般に、QCoreApplication、QGuiApplication、または QApplication オブジェクトを main() 関数でできるだけ早く作成することをお勧めします。exec() は、イベント ループが終了するまで戻りません。たとえば、quit() が呼び出されたとき。

もちろん、アクセスしようとする前であっても、という意味ですQApplication::applicationDirPath()
そうしないと、使用中にそのメソッドから正しいパスを取得できなくなりますQSettings

于 2016-08-19T14:07:22.327 に答える