问题描述
我有ini格式的数据,该数据最初是使用QSettings
编写的(因此它包含一些QSettings
特定的语法),并存储在QByteArray
中。我希望能够使用QSettings
对其进行读写。不幸的是,开箱即用的QSettings
似乎只能处理特定的文件,不能与QByteArray
或从QIODevice
派生的类实例(例如{ {1}}。
到目前为止,我发现了两种解决方法:
- 可能使用
QBuffer
将数据临时转储到文件中,并使用QTemporaryFile
读取 - 按照this ten year old thread的建议,创建一个
QSettings
的自定义实现,该实现可以从字节数组中的数据读取,就好像是一个文件一样。但是QAbstractFileEngine
在Qt 5中不再公开,因此这不是一个可行的选择。
如果可能的话,我想避免将此数据写入磁盘。自从旧线程发布以来已经过去了十年。现在有更好的方法吗?
edit:我暂时决定使用QAbstractFileEngine
,即使它在Qt 5中是私有的。至少从Qt 5.15开始它仍然存在。如果将其删除,我将更新代码以使用其他方法。不过,如果有人可以使用另一种不使用QAbstractFileEngine
的可行方法进行回答,我将保持开放性。
edit 2:QAbstractFileEngine仅适用于读取设置。不幸的是,使用QSettings编写设置总是假定该文件是本机文件。
解决方法
我认为您可以通过注册自己的格式来实现所需的功能。您提供了自己的读/写功能,因此您可以在其中执行任何操作。 docs提供了使用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");
...
}