3

私のデスクトップ アプリでは、QSettings を使用してさまざまなアプリケーションの値を永続化します。たとえば、メイン フォームの位置、最近使用したドキュメント、接続パラメータ、およびアプリケーションの動作を変更するいくつかのもの (たとえば、情報ダイアログで「このメッセージを再度表示しない」など) です。

これを処理する私の通常の方法は、アプリケーションの起動時にすべての設定を構造体またはオブジェクトに読み込み、アプリケーションの終了時にそれらを保存することです。

また、設定オブジェクトの多くの値を編集し、ダイアログを閉じたときにそれらを保存できるようにするダイアログもあります。

設定オブジェクトの値は、多くのウィンドウやおそらく非ビジュアル オブジェクトで必要になります。

これを行う最善の方法は何ですか?

メイン ウィンドウのメンバーとして設定オブジェクトを使用することから始めましたが、他のウィンドウがメイン ウィンドウのメンバーにアクセスする必要があるという問題があります。

独自の cpp ファイル内に設定オブジェクトを作成し、必要な場所に #include するだけでよいと思いました。しかし、これが可能かどうか、またはその構文かどうかはわかりません。

このシナリオのベスト プラクティスは何ですか?

4

3 に答える 3

1

問題が見えません。

2 つの基本的なオプションがあります。

  1. オブジェクトを一度作成し、それをすべてのウィンドウに渡します: 簡単にするために、設定オブジェクトのタイプが Qsettings であると仮定します。また、アプリケーションがマルチスレッド化されていないと仮定しましょう。このオブジェクトをメイン関数内で作成し、作成するすべてのウィンドウにパラメーターとして渡します。すべてのウィンドウは#include <QSettings>、それにアクセスする方法を知っています。独自の設定クラスがある場合も同様です。インターフェイスは独自のヘッダーにあり、実装は独自の cpp にあります。それを 1 つ作成し、すべてのウィンドウに渡します。
  2. コメントで述べたように、シングルトンを使用することもできます。関数内で静的に宣言されたのと同じインスタンスを返す設定クラスの静的関数を作成するだけです。このように:

class Settings
{
public:
    static Settings & TheSettings()
    {
        static Settings theSettings_;
        return theSettings_;
    }
    // Here go all methods for accessing the data
    // You will also want:
    ~Settings();
    Settings(const Settings &);
    Settings & operator=(const Settings &);
    // If you are using c++11 you may also want to add move constructor and assignment. 
    // Or you can just use the defaults for all the above if all your private members can destruct themselves  
private:
    Settings();
};

設定オブジェクトとして QSettings を使用した上記は次のとおりです。


class Settings
{
public:
    static QSettings & TheSettings()
    {
        static QSettings theSettings_;
        return theSettings_;
    }

private:
    Settings();
    Settings(const Settings &);
    Settings & operator=(const Settigns &);
};

これがあなたを正しい軌道に乗せることを願っています

PS。マルチスレッド アプリの場合、Settings オブジェクト内のすべての内部データがクリティカル セクション (またはミューテックス保護) 内でアクセスされるようにします。

PPS。Miki がコメントで述べたように、QSettings はスレッド セーフであるため、クリティカル セクションでアクセスをラップする必要がないことに注意してください。ただし、別の基本ストレージ (ファイル、別のコンテナーなど) を使用する場合は、おそらく必要になります。

于 2015-07-10T11:19:06.317 に答える