- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法设置 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 ,而这种“魔法”并没有真正的记录)。
所以我想到的唯一解决方案是:
QSettings
对象构造函数,并返回指向它的指针。这有一个缺点必须管理那个动态构造的对象的内存,因此不合理地增加了复杂性。它还添加了另一个实体这取决于应用程序的可移植性。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/
有没有办法设置 QSettings 存储的实际默认路径(有或没有文件名),并防止 QSettings 将组织名称等内容附加到该路径?这要求 QSettings 的进一步使用保持不变并且不知道设置存储路
你好,我有一个由应用程序生成的 Mac OS X plist 文件 (QSetting::NativeFormat),现在我想在不支持它的基于 Linux 的操作系统上使用这个 plist 文件。所以
Qt 错误报告链接:QTBUG-53313 从 Qt 5.5 迁移到 Qt 5.6 会出现一个问题 QSettings它在系统范围内找不到 QSettings 配置文件。在下面的 main.cpp 中
我程序里的设置挺多的,大概有3000个。它们不应该在程序开始时立即阅读,而是在需要时在程序的 10 个不同位置阅读。我想知道执行此操作的在性能/内存使用方面最有效的方法是什么: 1 始终打开一个“全局
我想用QSettings保存高分,但它不能正常工作。我在 2 个不同的文件中保存和读取这些值。 这是我负责将值添加到数组中的代码: QSettings settings; settings.begin
我从某个位置上传文件,然后下一次上传必须指向上次上传的位置。 我怎样才能使用 QSettings 来实现? ? 最佳答案 在使用 QSettings 之前,我建议在您的 main() 中设置一些有关您
我有 ini 格式的 QSettings 对象。 当我在 ini 文件中写入 settings.beginGroup("GENERAL") 时,我看到以下内容: [%常规] 为什么会这样? 最佳答案
我正在尝试为 QSettings 创建自定义格式,但无法从存储中读取它。 在下面的代码中,如果我运行 settings.setValue("test", 123") ,它会正确调用 write 函数并
我正在使用QSettings在Windows中将某些数据存储为ini文件。 我想查看ini文件,但我不知道ini文件的位置。 这是我的代码: QSettings *set = new QSetting
我使用 QSettings 来编辑 .desktop 菜单条目。我这样做: dfile 是一个 QString - 绝对文件路径 QSettings set(dfile, QSettings::Ini
我正在尝试在我的代码中使用 QSettings,但它无法正常工作。我的代码是: In Mainwindow.h QSettings settings (我已经在所有setOrganizationNam
我正在使用非图形用户界面产品的 Qsettings 将其设置存储到 xml 文件中。这是作为一个库编写的,可在 C、C++ 程序中使用。每个产品将有 1 个 xml 文件。每个产品可能有多个子产品,它
我想知道为什么这段基于虚假公司名称和应用程序名称创建 Qt 设置实例的代码不起作用。 这里是mainwindow.h,还有一个main.cpp,还有mainwindow.cpp,一个.pro文件,.u
我正在使用 Qsetting 来存储上次使用的值。我的代码只适用于一个领域。这意味着当我为第二轮应用相同的逻辑时它只工作一次,但它不会那样做。 文件io.cpp #include "fileio.h"
Does Qt has something like QSettings, but for local scopes? 我正在寻找具有相同方法但不特定于 APPLICATION 的数据结构。 我的意思
QSettings settings("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",QSettings::Nati
有没有办法使用 QSettings 为每个键存储多个值,并将其存储在人类可读(无二进制文件).ini 文件中? 可能看起来像: key_1=value_1,value2 key_2=value_1 .
我正在尝试为我的 Qt 应用程序实现应用程序设置。我正在使用 QSettings ,像这样创建了我的类的实例 settings = new QSettings(qApp->organizationNa
我正在使用 QSettings 编写一个 .ini 文件,它将作为我的应用程序配置文件。只有一个问题: QSettings 将组名 [General] 添加到文件的顶部。 我这样设置文件: QSett
我编写了一个简单的应用程序来使用 QSettings。谁能告诉我我在这里做错了什么.. 主窗口.h class MainWindow : public QMainWindow { Q_OBJE
我是一名优秀的程序员,十分优秀!