c++ - 将 QSettings 与存储在 QByteArray 或 QIODevice 中的数据一起使用?
问题描述
我有 ini 格式的数据,这些数据最初是使用QSettings
(因此它包含一些QSettings
特定的语法)编写的,存储在QByteArray
. 我希望能够使用QSettings
. 不幸的是,开箱即QSettings
用似乎只能专门处理文件,不能用于QByteArray
派生QIODevice
自QBuffer
.
到目前为止,我已经找到了两种处理方法:
- 将数据临时转储到文件中,可能使用
QTemporaryFile
,并使用读取QSettings
- 创建一个可以从字节数组中读取数据的自定义实现,
QAbstractFileEngine
就像它是一个文件一样,正如这个十年老线程中所建议的那样。然而QAbstractFileEngine
,在 Qt 5 中不再公开,因此这不是一个可行的选择。
如果可能的话,我想避免将这些数据写入磁盘。自从那个旧帖子发布以来已经过去了十年。现在有更好的方法吗?
编辑:目前我决定使用QAbstractFileEngine
它,即使它在 Qt 5 中是私有的。至少它仍然在 Qt 5.15 左右。如果它被删除,我将更新我的代码以使用不同的方法。不过,我将保持这个问题的开放性,以防有人可以用另一种不使用的可行方法来回答QTemporaryFile
。
编辑 2:QAbstractFileEngine 仅适用于读取设置。不幸的是,使用 QSettings 编写设置总是假定文件是本机文件。
解决方案
我认为您可以通过注册自己的格式来实现您想要的。您提供自己的读/写功能,因此您可以在其中做任何您想做的事情。文档提供了使用 XML 格式的示例。您可以轻松地将其修改为写入 QByteArray。
// Buffer to store settings
QByteArray someBuffer;
bool readSettingsFromBuffer(QIODevice &device, QSettings::SettingsMap &map)
{
// Ignore "device" and read from someBuffer instead.
}
bool writeSettingsToBuffer(QIODevice &device, const QSettings::SettingsMap &map)
{
// Ignore "device" and write to someBuffer instead.
}
int main(int argc, char *argv[])
{
const QSettings::Format BufferFormat =
QSettings::registerFormat("buffer", readSettingsFromBuffer, writeSettingsToBuffer);
QSettings settings(BufferFormat, QSettings::UserScope, "MyCompany",
"MyApplication");
...
}
推荐阅读
- angular - 角度点击事件在动态列表中不起作用
- python - np.any() 是否可以使用快捷评估?
- c# - 如何从 C# 中的 PPT 文件中提取字体颜色?
- php - 如何从验证表单中获取可用的 ID?
- mysql - Mysql 8.0 密码不想更改但不会出错
- string - 解析药物名称
- css - 你能让材料 ui 选项卡响应吗?
- swift - 如何在 Alamofire 中的 sessionTask 恢复之前调用自定义方法
- amazon-web-services - 在从 AWS Backup 恢复的 AWS EC2 实例上创建标签
- html - 我只在 safari 中得到不需要的圆形边框