首页 > 解决方案 > 将 QGraphicsView 或 Scene 转为 XML/JSON

问题描述

我正在寻找一种简单的方法(我认为没有)将 QGraphicsView 或 QGraphicsScene 序列化为 XML 或 JSON。

我不知道我是否应该保存视图或场景。XML 或 JSON 很好,我只需要其中一个。我只想将场景保存在文件中以保存/加载它

我在其他网站上发现了一些东西,但它看起来很复杂,或者不是真的有用。

标签: c++jsonxmlqtserialization

解决方案


首先,查看这个非常有用的使用 json 的教程。其次,我想我已经读到您正在使用基于模型视图的项目?

如果是这样,则应保存所有模型信息,然后有两种可能性(取决于您的设计)。假设您创建了一个模型类PlayerList,并且正在向所有玩家展示使用PlayerListLayoutorPlayerListView的派生类QVBoxLayout。现在有两种可能:

  1. 在每个视图类中,您都可以直接引用模型类。好吧,您只需要使用 getter 询问模型(这些 getter 已经存在,否则您不想将信息可视化)。你不需要json文件,只要你先初始化你的模型。因此,对于PlayerListLayout,您需要做的就是询问该成员中的每个Player*成员PlayerList并呼吁PlayerLayout::read(Player* player)所有PlayerLayout成员PlayerListLayoutPlayerLayout将初始化它的新玩家参考并询问名称、大写字母等以将其可视化。

  2. 在其中一个视图类中,您没有引用任何模型类。然后您必须将模型或 json 文件传递​​给该视图类,以便您可以(再次)获取/读取信息。这是一种不太干净的方式,我不喜欢。我碰巧正在创建要阅读的大型函数;就在那时,我发现有些事情必须改变。阅读和写作应该很容易(如果您将职责划分为多个类)。

我有一个 Monopoly 项目,我也使用了这个序列化,而且这个教程真的很有帮助。其次,我在模型类之外.json打开了文件(因此在视图类中),您可能也需要考虑这一点。缺点是“当你想重用模型类而不是视图类时”,你必须在你的新 gui 中重新实现文件的打开和关闭。

但是,通过这种方式,您可以在整个代码中创建并行性,因为返回 true/false 将发生在主模型的视图类中(MonopolyLayout在我的例子中),所以方法Monopoly::read(...)Board::read(...)以类似的方式运行。


推荐阅读