c++ - Qt:从应用程序/可执行目录获取设置 ini 文件时出现问题

标签 c++ qt configuration application-settings qsettings

我在 Windows7 上使用 Qt5.7。
在我当前的应用程序中,我有自己的设置管理器类,如下所示:

标题:

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

private:
    static QSettings settings;
};

源代码:

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);
}

我的问题是:我把这个应用程序给了一些 friend ,他们可能用不同的工作目录或其他东西启动了它,应用程序没有找到 settings.ini 文件,因此它没有'不能正常工作……

那么,问题是:如何修改上面的代码才能从 application/executable 目录中获取 settings.ini 文件?显然,settings.ini 文件始终与应用程序本身位于同一文件夹中。

最佳答案

看到一个对象全是非静态成员函数,全是静态数据成员,似乎有点奇怪。您是否像 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 实例。但我更愿意让整个类(class)成为单例:

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;
};

settingsmanager.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");

关于c++ - Qt:从应用程序/可执行目录获取设置 ini 文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304255/

相关文章:

C++:直接在参数列表中使用数组文字的对象构造函数

c++ - decltype-specifier 表示的类型是什么类型,其表达式是类类型的临时对象的成员?

c++ - dlopen - undefined symbol 错误

c++ - QFile::copy 静态函数不复制文件

java - 在哪里/如何为 Tomcat .war 文件设置配置资源

c# - 我可以在没有 Visual Studio 的情况下编译 DLL 吗?

c++ - Qt错误: LNK1181: cannot open input file 'debug\main.obj'

c++ - 在 Qt 中移动 Snake 时遇到问题

Spring Security 自定义 PermissionEvaluator 配置无法正常工作

c# - 在 ASP.NET 样板中为应用程序服务配置审计日志记录