如何将QAbstractItemModel序列化为QDataStream?

时间:2015-08-24 07:44:56

标签: serialization qabstractitemmodel qt5.4 qstandarditemmodel qdatastream

我已经设置了一个QAbstractItemModel并用数据填充了它。我的QTreeView小部件正确显示该模型中的每个数据。

现在,我想将该序列化的模型存储在二进制文件中(后来将cource加载到二进制文件中的模型中)。这可能吗?

1 个答案:

答案 0 :(得分:0)

与序列化任何内容的方式相同,只需实现一个操作符或方法,将每个数据成员按顺序写入数据流。

首选格式是为您的类型实现这两个运算符:

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<ul class="accordion" data-bind="foreach: items">
    <li data-bind="css: {'accordion-open': $data === $parent.openItem()}, click: $parent.openItem">
        <div class="header" data-bind="text: header"></div>
        <div class="content" data-bind="text: content"></div>
    </li>
</ul>

遵循该模式将允许您的类型&#34;即插即用&#34;使用Qt的容器类。

QDataStream &operator<<(QDataStream &out, const YourType &t); QDataStream &operator>>(QDataStream &in, YourType &t); 没有(或不应该)直接保存数据,它只是底层数据结构的包装器。该模型仅用于为视图提供访问数据的接口。所以实际上你不应该序列化实际模型,而是基础数据。

至于如何序列化实际数据,它取决于您的数据格式,到目前为止仍然是一个谜。但是因为它是QAbstractItemModel我认为它是某种树,所以一般来说,你必须遍历树并序列化其中的每个对象。

请注意,序列化单个对象时,序列化和反序列化是一个盲序列,但在处理对象集合时,您可能需要考虑其结构以及额外的序列化数据。如果您的树类似于数组数组,只要您使用Qt的容器类,这将为您完成,您所需要的只是实现项类型的序列化,但是对于自定义树,你必须自己做。