看到所有非静态成员函数和所有静态数据成员的对象似乎有点奇怪。你用它喜欢SettingsManager()::read(...)
吗?只使用命名空间中的函数或单例模式可能更合适。
无论如何,回到这个问题,你可以使用QApplication::applicationDirPath()来达到这个目的。它获取包含应用程序二进制文件的目录的绝对路径。例如
QString absPath = QDir(QApplication::applicationDirPath()).filePath("settings.ini");
获得您想要的绝对路径。
编辑: - 回复关于“QApplication 不存在错误”的评论
似乎您对此有疑问,因为您在全局静态初始化程序中使用它,该初始化程序在进入 main() 之前运行,因此还没有 QApplication。您可以使用静态函数变量来延迟初始化,直到调用该函数。
您可以选择制作单例 SettingsManager,也可以只制作 QSettings(我认为 QSettings 可能像我上面所说的更奇怪)。
QSettings单例示例:(需要在cpp中定义)
QSettings& globalInstance() {
static QSettings settings(QDir(QApplication::applicationDirPath()).filePath("settings.ini"));
return settings;
}
如果你在你的函数中使用它,它不会创建一个 QSettings,直到你调用了这个函数,然后会有一个 QApplication 实例。但我更愿意让整个班级单身:
设置管理器.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");