将 QGraphicsView 或 Scene 转换为 XML/JSON

Turn QGraphicsView or Scene into XML/JSON

本文关键字:XML JSON 转换 QGraphicsView Scene      更新时间:2023-10-16

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

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

我在其他网站上找到的东西很少,但它似乎很复杂,或者没有真正的功能。

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

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

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

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

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

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