我有 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 写入设置总是假设该文件是本机文件。
编辑3:这不是一个调试问题,我不知道为什么它因缺乏调试细节而被关闭,因此需要一个最小的示例是没有意义的。这是询问如何在特定 API 中实现特定目标。如果我能举出一个最小的例子,我就不会问这个问题了!
我认为你可以通过注册自己的格式来实现你想要的。您提供自己的读/写函数,因此您可以在其中执行任何您想要的操作。 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");
...
}