2016-08-19 10 views
2

私は静的なクラスを持っていて、静的なものを持っていますQSettings。 しかし、私の初期化と私は警告を取得:最初にQApplicationオブジェクトをインスタンス化してください

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

QCoreApplication :: applicationDirPath:インスタンス化してくださいはQApplication私は私のメインの先頭に手動でQSettingを初期化し、回避策として、最初

オブジェクトを関数。静的メンバーを初期化する良い方法はありますか?

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

答えて

7

理想的には、任意の種類の静的クラスインスタンスを持たないようにしてください。シングルトンはmain()にローカルインスタンスを持ち、静的メソッドはインスタンスポインタを介して通常のメソッドに転送する必要があります。良い例のためにQCoraApplicationがそれをいかにするか参照してください。

いずれにしても、QSettingsのインスタンスは一時的である可能性があります。これは、設定メカニズムに対するハンドルです。それを静的にしたり、周りに置いたりすることはあまり意味がありません。関数内のローカル変数としてはQSettingsが普通です。

+0

ありがとうございました!私は今、シングルトンを正しい方法で実装したことを願っています(少なくとも、デザインパターンの適切な実装について学んだのは少し前です)。 あなたのプライベートメンバーとしてクラスごとにインスタンスを1つだけ作成する代わりに、QSettingsのローカルインスタンスを作成する際のメリットは何ですか? – honiahaka10

+0

別の言い方をすると、それは他のやり方には利点がありません。 'QSettings'は設定システムのハンドルです。とにかくそれを使用することはまれでしかありません。 –

+0

@ honiahaka10あなたはどのようにそのシングルトンを実装しましたかを詳しく教えてください。 – agbb

1

QApplicationは、QCoreApplicationに由来します。あなたがsourcesから見ることができるように
applicationDirPathは次のように定義される:コードに深く行くことによって

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

    // ... more code 
} 

、我々はselfは、init関数によって初期化されているが、コンストラクタによって呼び出されることがわかります。
Q*Applicationクラス(この場合はQApplicationのインスタンス)を明示的に作成しない限り、期待通りに動作しないように見えます。できるだけ早く、このようなクラスを作成することが提案されていることを上記のドキュメントから

注意:一般的に

、我々は)あなたがQCoreApplication、QGuiApplicationまたはメインではQApplicationオブジェクトを(作成することをお勧めします可能な限り早く機能する。 exec()はイベントループが終了するまで戻りません。たとえば、quit()が呼び出されたときなどです。

もちろん、QApplication::applicationDirPath()にアクセスしようとする前であっても意味します。
それ以外の場合は、QSettingsを使用している間は、その方法から正しいパスを取得できません。

+0

Tahnkあなた!私はすでにそれについて読んだので、私はこの問題を解決するための正しい方法を求めたのです。クーバ・オーベル(Kuba Ober)がそれを解決すると述べたようにサインを使用した。 – honiahaka10

関連する問題