将 QSettings 与存储在 QByteArray 或 QIODevice 中的数据一起使用? [已关闭]

问题描述 投票:0回答:1

我有 ini 格式的数据,最初是使用

QSettings
编写的(因此它包含一些
QSettings
特定的语法),存储在
QByteArray
中。我希望能够使用
QSettings
对其进行读取和写入。不幸的是,开箱即用的
QSettings
似乎只能专门处理文件,并且不能与
QByteArray
或派生自
QIODevice
的类的实例(例如
QBuffer
)一起使用。

到目前为止,我找到了两种处理此问题的方法:

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

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

编辑:暂时我决定使用

QAbstractFileEngine
,尽管它在 Qt 5 中是私有的。至少从 Qt 5.15 开始它仍然存在。如果它被删除,我将更新我的代码以使用不同的方法。不过,我将保持这个问题的开放性,以防有人可以用另一种不使用
QTemporaryFile
的可行方法来回答。

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

编辑3:这不是一个调试问题,我不知道为什么它因缺乏调试细节而被关闭,因此需要一个最小的示例是没有意义的。这是询问如何在特定 API 中实现特定目标。如果我能举出一个最小的例子,我就不会问这个问题了!

c++ qt qbytearray qsettings qiodevice
1个回答
1
投票

我认为你可以通过注册自己的格式来实现你想要的。您提供自己的读/写函数,因此您可以在其中执行任何您想要的操作。 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");

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.