gpt4 book ai didi

c++ - 防止 QSettings 将组织名称添加到 QSettings::setPath() 设置的路径中

转载 作者:行者123 更新时间:2023-11-30 04:50:33 32 4
gpt4 key购买 nike

有没有办法设置 QSettings 存储的实际默认路径(有或没有文件名),并防止 QSettings 将组织名称等内容附加到该路径?这要求 QSettings 的进一步使用保持不变并且不知道设置存储路径。

考虑用例。在我的主要我有以下代码:

QApplication a(argc, argv);

...

QCoreApplication::setApplicationName(APP_NAME);
QCoreApplication::setOrganizationDomain(MY_DOMAIN);
QCoreApplication::setOrganizationName(MY_ORGANIZATION);
QCoreApplication::setApplicationVersion(APP_VERSION);

...

a.exec();

在我的整个项目中,我都像这样使用 QSettings:

QSettings settings;

settings.setValue(somePath, someValue);

someOtherValue = settings.value(someOtherPath, someDefault);

现在我需要使应用程序具有可移植性。所以我将 main 中的代码更改为:

QApplication a(argc, argv);

...

QCoreApplication::setApplicationName(APP_NAME);
QCoreApplication::setOrganizationDomain(MY_DOMAIN);
QCoreApplication::setOrganizationName(MY_ORGANIZATION);
QCoreApplication::setApplicationVersion(APP_VERSION);

if (PORTABLE) {
QSettings::setDefaultFormat(QSettings::IniFormat);
QString settingsPath = a.applicationDirPath() + "/settings";
QSettings::setPath(QSettings::defaultFormat(), QSettings::UserScope, settingsPath);
QSettings::setPath(QSettings::defaultFormat(), QSettings::SystemScope, settingsPath);
}

...

a.exec();

但不是将设置写入 APP_PATH/settings/,而是实际位置变为 APP_PATH/settings/ORGANIZATION_NAME/,在我看来这有点太丑陋了。

我想设置 QSettings 以将设置存储在特定位置。用户代码必须不知道存储位置的变化。理想情况下在 main 中设置 QSettings,并使用进一步使用默认构造函数构造的对象。

我发现只有 QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr) 构造函数才能真正设置存储位置。所有其他构造函数不断向路径中添加内容。由于我不希望用户代码了解应用程序的可移植性,因此每次都使用不同的构造函数不是一种选择。

我考虑过像这样子类化 QSettings 来修复 setPath():

class Settings : public QSettings {
private:
static QString mPath = "";

public:
Settings(QObject *parent = nullptr) :
QSettings(
mPath.isEmpty() ?
QSettings() :
QSettings(mPath, Settings::defaultFormat, parent)
)
{}

static void setPath(QSettings::Format format, QSettings::Scope scope, const QString &path)
{
mPath = path;
QSettings::setPath(format, scope, path);
}
}

但这是不可能的,因为 QSettings 没有复制构造函数。在每种情况下都使用 QSettings(mPath, Settings::defaultFormat, parent) 构建基础,但是如果尚未设置,则将 mPath 设置为默认路径,可以也不行,因为没有获取默认QSettings存储路径的方法(有setPath,没有getPath;有getFileName 而没有 setFileName;从 fileName 导出“路径”很容易出错,因为 Qt 添加了一些“魔法”,比如组织名称,到“路径”以导出 fileName ,而这种“魔法”并没有真正的记录)。

所以我想到的唯一解决方案是:

  1. 创建一个了解应用程序可移植性的工厂,使用适当的堆在堆上构造一个 QSettings 对象构造函数,并返回指向它的指针。这有一个缺点必须管理那个动态构造的对象的内存,因此不合理地增加了复杂性。它还添加了另一个实体这取决于应用程序的可移植性。
  2. 如上操作,但使用单例。这也增加了多余的复杂性,同时解决简单的问题。同样在这种情况下QSettings 对象将在整个应用程序生命周期内存在。

所以我觉得我肯定在这里遗漏了一些东西,我想知道是否有更简单的解决方案来解决这个问题。

旁注:目前我通过将我的组织名称设置为“settings”(如果应用程序是可移植的)来解决此问题,因此应用程序设置存储在 APP_FOLDER/settings/APP_NAME.ini 中。一个肮脏的黑客,但节省了很多复杂性。无论如何,我真的不会在任何地方使用组织名称。

最佳答案

我的理解是,您本质上希望根据是否设置了特定路径,以两种方式之一构造 QSettings

除了继承 QSettings 之外,您还可以创建一个带有指向成员 -> 运算符的重载指针的类,该运算符返回指向 QSettings 的指针实例。这样,QSettings 的初始化可以推迟到需要时进行,并使用已设置的任何信息。

class settings {
public:
static void set_path (QSettings::Format format, QSettings::Scope scope, const QString &path)
{
s_path = path;
QSettings::setPath(format, scope, path);
}
QSettings *operator-> ()
{
return get_settings();
}
private:
QSettings *get_settings ()
{
if (!m_settings) {
if (s_path.isEmpty()) {
m_settings = std::make_unique<QSettings>();
} else {
m_settings = std::make_unique<QSettings>(s_path, QSettings::defaultFormat());
}
}
return m_settings.get();
}
static QString s_path;
std::unique_ptr<QSettings> m_settings;
};

QString settings::s_path = "";

与默认设置/值一起使用时...

settings settings;
std::cout << "\nsettings file path is [" << settings->fileName() << "]";

上面给出了类似...

settings file path is [/home/<user>/.config/Unknown Organization/appname.conf]

使用...显式设置所需路径

settings::set_path(QSettings::defaultFormat(), QSettings::SystemScope, app.applicationDirPath() + "/settings.ini");
settings settings;
std::cout << "\nsettings file path is [" << settings->fileName() << "]";

给...

settings file path is [/home/<user>/scratch/settings.ini]

关于c++ - 防止 QSettings 将组织名称添加到 QSettings::setPath() 设置的路径中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54956708/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com