将QSettings与存储在QByteArray或QIODevice中的数据一起使用?

问题描述

我有ini格式的数据,该数据最初是使用QSettings编写的(因此它包含一些QSettings特定的语法),并存储在QByteArray中。我希望能够使用QSettings对其进行读写。不幸的是,开箱即用的QSettings似乎只能处理特定的文件,不能与QByteArray或从QIODevice派生的类实例(例如{ {1}}。

到目前为止,我发现了两种解决方法:

  1. 可能使用QBuffer将数据临时转储到文件中,并使用QTemporaryFile读取
  2. 按照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");

    ...
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...