2017-10-31 13 views
0

Qtアプリケーションのアプリケーション設定を実装しようとしています。 私は、QSettingsで働いているこの私のアプリケーションのQ設定にアクセスする

settings = new QSettings(qApp->organizationName(), qApp->applicationName()); 

のような私のクラスのインスタンスを作成し、思っていた:私のアプリを通じて私の設定にアクセスするための最良の方法は何ですか?

私は別のクラスのいくつかの設定にアクセスする必要がありますが、QSettingsのインスタンスを1つだけ宣言して作成しなければならず、どこでも必要な場所にアクセスできるようにする必要があるかどうかわかりません。QSettings私はいくつかの設定にアクセスする必要があります。

答えて

1

私の意見では、これを行う最善の方法は、QSettingsオブジェクトを割り当てるためのシングルトンデザインパターンを実装することですが、QSettingsを共有する場合、アトミック永続性を処理する必要があることを覚えておいてください。ときどきsync()メソッドを使用して、C++クラス間でデータを保持します。 QMLレイヤーで設定を使用する必要はないことを理解しています。そのような場合は、qmlRegisterSingletonTypeというメソッドをQMLで使用することができます。

+0

メインウィンドウのコンストラクタでQSettingsの一意のインスタンスを作成する場合は、シングルトン設計が必要ですか?次回のアプリ起動時に設定を考慮する必要があるので、おそらくsync()を呼び出す必要はありません。 – nmud

+0

@jgdはい、シングルトンクラスのグローバル設定にアクセスするのに最適です+1 – saeed

+0

@nmud sync()はpersistの直後に呼び出されます。あなたは書き込みをするか、設定を読み込むだけですか? – jgd

2

のQtのドキュメントとして、singletoneを使用する必要はありませんが、言うQSettings

あなたのアプリケーションの多くの場所からQSettingsを使用する場合は

、あなたは組織名やアプリケーションを指定したい場合があります:: QCoreApplicationを使用して名前setOrganizationName()とQCoreApplication :: setApplicationName()、およびデフォルトのQSettingsのコンストラクタを使用します。

その後、はQApplicationの作成後:

01あなたがQSettingsmを使用したい場合は、単にコアアプリケーションからデフォルトのパラメータを取りますデフォルトコンストラクタを使用

QCoreApplication::setOrganizationName("MySoft"); 
QCoreApplication::setOrganizationDomain("mysoft.com"); 
QCoreApplication::setApplicationName("Star Runner"); 

QSettings settings; 
settings.setValue("example", 68); 

の下に、異なるデフォルトパラメータを設定

QML、代替はSettings、setpsは同じです、あなたのGUIアプリケーションを構成してください:

QGuiApplication app(argc, argv); 
app.setOrganizationName("Some Company"); 
app.setOrganizationDomain("somecompany.com"); 
app.setApplicationName("Amazing Application"); 
異なる設定を設定

そしてQMLで、:

Settings { 
    property alias x: window.x 
    property alias y: window.y 
    property alias width: window.width 
    property alias height: window.height 
} 
+0

組織名とアプリケーションを指定するコンストラクタでローカルインスタンスを作成している限り、それは問題ありませんか? – nmud

+1

@nmud QCoreApplicationがセットアップされると(通常はmain関数内に)、設定が必要な場所であれば、QSettingsのためにパラメータのないコンストラクタを使うだけで済みます。 – SirDarius

0

アプリケーション全体singletonのグローバル設定がいいアイデアかもしれない持つためには、私は、設定クラスのパターンを持っていると私はここに多分便利なポストあなたと他の人に。

ここでは、私はGlobalSettingsクラスを持っています。これは、シングルトンであるヘッダーとcppファイルです。

ヘッダファイル:

#ifndef GLOBALSETTINGS_H 
#define GLOBALSETTINGS_H 

#include <QSettings> 
#include <QObject> 

class GlobalSettings 
{ 
public: 
    Q_DISABLE_COPY(GlobalSettings) 

    static GlobalSettings* getSettings(); 

    // Settings getter and setters 

    QString Setting1() const; 
    void setSetting1(const QString &Setting1); 

    QString Setting2() const; 
    void setSetting2(const QString &Setting2); 

private: 

    // private constructor 
    GlobalSettings(); 
    static GlobalSettings * m_Settings; 

    QSettings * settings; 

    // Settings memebers 
    QString m_Setting1; 
    QString m_Setting2; 

}; 

#endif // GLOBALSETTINGS_H 

とGlobalSettings

#include "globalsettings.h" 

#include <QCoreApplication> 

GlobalSettings * GlobalSettings::m_Settings = NULL; 

GlobalSettings::GlobalSettings() 
{ 
    settings = new QSettings(qApp->organizationName(), qApp->applicationName()); 
    if (!settings->contains("Setting1")) 
    { 
     settings->setValue("Setting1","Something"); // default value 
    } 
    else 
    { 
     m_Setting1 = settings->value("Setting1").toString(); 
    } 

    if (!settings->contains("Setting2")) 
    { 
     settings->setValue("Setting2","Something"); // default value 
    } 
    else 
    { 
     m_Setting2 = settings->value("Setting2").toString(); 
    } 
    settings->sync(); 
} 

GlobalSettings *GlobalSettings::getSettings() 
{ 
    if (m_Settings == NULL) 
    { 
     m_Settings = new GlobalSettings(); 
    } 
    return m_Settings; 
} 

QString GlobalSettings::Setting1() const 
{ 
    return m_Setting1; 
} 

void GlobalSettings::setSetting1(const QString &Setting1) 
{ 
    m_Setting1 = Setting1; 
    settings->setValue("Setting1",Setting1); 
} 

QString GlobalSettings::Setting2() const 
{ 
    return m_Setting2; 
} 

void GlobalSettings::setSetting2(const QString &Setting2) 
{ 
    m_Setting2 = Setting2; 
    settings->setValue("Setting2",Setting2); 
} 

、ここであなたが

#include "mainwindow.h" 
#include <QApplication> 

#include <QDebug> 

#include <globalsettings.h> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    GlobalSettings * setting = GlobalSettings::getSettings(); 

    qDebug() << setting->Setting1(); 


    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

となりました場合を使用したいところ今までそれを使用する方法であるためCPPファイルあなたはgetとsetter関数でmutexをロックするかもしれないスレッドセーフな設定クラスを持っています

+0

これにはグローバル変数が必要ですか?私はグローバル変数にはあまり慣れていません。ローカルインスタンスを扱うのであれば、むしろそうするでしょう。 – nmud

+0

シングルトンアプローチをより深く理解してください。 – saeed

+0

となります。また、QSettingsスレッドセーフではありませんか?何故mutexが必要なのですか? – nmud

関連する問題