0

Windows7でQt5.7を使用しています。
現在のアプリには、次のような独自の設定マネージャー クラスがあります。

ヘッダ:

class SettingsManager
{
public:
    void     write(const QString & key, const QVariant & variant);
    QVariant read (const QString & key) const;

private:
    static QSettings settings;
};

ソース cpp:

QSettings SettingsManager::settings("settings.ini", QSettings::IniFormat);

void SettingsManager::write(const QString & key, const QVariant & variant)
{
    settings.setValue(key, variant);
}

QVariant SettingsManager::read(const QString & key) const
{
    return settings.value(key);
}

私の問題は、アプリを何人かの友人に渡したところ、おそらく彼らは別の作業ディレクトリなどで起動したため、アプリがsettings.iniファイルを見つけられなかったため、正常に機能しませんでした...

問題は、上記のコードを変更してsettings.ini、アプリケーション/実行可能ディレクトリからファイルを取得できるようにするにはどうすればよいかということです。明らかに、settings.iniファイルは常にアプリ自体と同じフォルダーにあります。

4

3 に答える 3

3

すべての非静的メンバー関数とすべての静的データ メンバーを持つオブジェクトを見るのは少し奇妙に思えます。のように使っていSettingsManager()::read(...)ますか?名前空間で関数を使用するか、シングルトン パターンを使用する方が適切な場合があります。

とにかく、質問に戻ると、この目的のためにQApplication::applicationDirPath()を使用できます。アプリのバイナリを含むディレクトリへの絶対パスを取得します。例えば

QString absPath = QDir(QApplication::applicationDirPath()).filePath("settings.ini");    

必要な場所への絶対パスを取得します。

編集: - 「QApplication does not exist エラー」に関するコメントへの応答

main() に入る前に実行されるグローバルな静的初期化子で使用しているため、これに問題があるようです。そのため、QApplication はまだありません。静的関数変数を使用して、関数が呼び出されるまで初期化を遅らせることができます。

シングルトンの SettingsManager を作成するか、QSettings だけを作成するかを選択できます (上記で述べたように、QSettings はおそらくもっと奇妙だと思います)。

QSettings シングルトンの例: (cpp で定義する必要があります)

QSettings& globalInstance() {
    static QSettings settings(QDir(QApplication::applicationDirPath()).filePath("settings.ini"));
    return settings;
}

関数でそれを使用すると、関数を呼び出すまで QSettings が作成されず、それまでに QApplication インスタンスが作成されます。しかし、私はクラス全体をシングルトンにしたいと思います:

settingsmanager.h :

#include <QApplication>
#include <QDir>
#include <QSettings>

class SettingsManager
{
public:
    SettingsManager & instance();

    void     write(const QString & key, const QVariant & variant);
    QVariant read (const QString & key) const;

private:
    SettingsManager(const QString & path) : 
        settings(path, QSettings::IniFormat)
    {}

    QSettings settings;
};

設定マネージャー.cpp :

#include "settingsmanager.h"

SettingsManager& SettingsManager::instance() {
    static SettingsManager s(QDir(QApplication::applicationDirPath()).filePath("settings.ini"));
    return s;
}

void SettingsManager::write(const QString & key, const QVariant & variant)
{
    settings.setValue(key, variant);
}

QVariant SettingsManager::read(const QString & key) const
{
    return settings.value(key);
}

利用方法:

auto val = SettingsManager::instance().read("key");
于 2016-10-28T11:58:33.023 に答える
2

で設定パスを設定できますQSettings::setPath

そう

QSettings::setPath(QSettings::IniFormat,QSettings::SystemScope,
                  QCoreApplication::applicationDirPath());

トリックを行う必要があります。

SystemScopeあなたは1つのiniファイルを持っているので、ユーザーベースごとではなく、ここで適切だと思います

注:これにより、Qtがプログラム内のすべてのiniファイルを検索する場所が設定されるため、SystemScope複数のiniファイルの場所が必要な場合はこれを使用しないでくださいSystemScope

于 2016-10-28T12:49:55.500 に答える
1

アプリケーションで ini ファイルを送信しないでください。ユーザーが初めてアプリケーションを起動すると、アプリは ini ファイルを作成します。設定を読むときは、常にデフォルト値を設定する必要があります。将来の使用のために、ユーザーはデフォルト値を上書きし、保存された設定を使用します。

読み取り関数を次のように変更します。

QVariant SettingsManager::read(const QString & key, const QVariant &defaultValue) const
{
    return settings.value(key,defaultValue);
}

そして、関数を呼び出す場所は常にデフォルト値を提供します

于 2016-10-28T11:57:37.610 に答える