すべての非静的メンバー関数とすべての静的データ メンバーを持つオブジェクトを見るのは少し奇妙に思えます。のように使ってい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");