我在 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/