首页 > 解决方案 > 将 QSettings 与存储在 QByteArray 或 QIODevice 中的数据一起使用?

问题描述

我有 ini 格式的数据,这些数据最初是使用QSettings(因此它包含一些QSettings特定的语法)编写的,存储在QByteArray. 我希望能够使用QSettings. 不幸的是,开箱即QSettings用似乎只能专门处理文件,不能用于QByteArray派生QIODeviceQBuffer.

到目前为止,我已经找到了两种处理方法:

  1. 将数据临时转储到文件中,可能使用QTemporaryFile,并使用读取QSettings
  2. 创建一个可以从字节数组中读取数据的自定义实现,QAbstractFileEngine就像它是一个文件一样,正如这个十年老线程中所建议的那样。然而QAbstractFileEngine,在 Qt 5 中不再公开,因此这不是一个可行的选择。

如果可能的话,我想避免将这些数据写入磁盘。自从那个旧帖子发布以来已经过去了十年。现在有更好的方法吗?

编辑:目前我决定使用QAbstractFileEngine它,即使它在 Qt 5 中是私有的。至少它仍然在 Qt 5.15 左右。如果它被删除,我将更新我的代码以使用不同的方法。不过,我将保持这个问题的开放性,以防有人可以用另一种不使用的可行方法来回答QTemporaryFile

编辑 2:QAbstractFileEngine 仅适用于读取设置。不幸的是,使用 QSettings 编写设置总是假定文件是本机文件。

标签: c++qtqbytearrayqsettingsqiodevice

解决方案


我认为您可以通过注册自己的格式来实现您想要的。您提供自己的读/写功能,因此您可以在其中做任何您想做的事情。文档提供了使用 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");

    ...
}

推荐阅读