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 不存在错误”的评论

似乎您对此有疑问,因为您在全局静态初始化程序中使用它,该初始化程序在进入 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");
于 2016-10-28T11:58:33.023 回答
2

您可以设置设置路径QSettings::setPath

所以

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

应该做的伎俩。

因为您似乎有一个 ini 文件,而不是每个用户群,我认为SystemScope这里是合适的

注意:这将设置此位置 Qt在您的程序中查找所有SystemScopeini 文件,因此如果您想要多个 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 回答