我有一个棘手的问题要解决。想象一下:

我的一个应用程序需要大量使用脚本,因此我的想法是为用户提供编写脚本片段并在目录般的树结构中组织它们的方法。这很像带有子目录和源文件的源代码目录。

数据类/存储

我遇到的第一个问题是,我需要找到一种存储整个树结构的好方法(在磁盘上以及在运行时的应用程序中)。为此,我有这些想法:

  1. 使用QOBject派生的类,该类可以使用QOBject的父/子功能表示树。这样,如果父母被删除,我不必担心删除这些物体。
  2. 使用一个简单的类,该类可能包含一个儿童的Qlist(无指针)和一些存储每个组/脚本属性的属性。
  3. 使用方法#2,但使用指针代替静态对象 - 这将避免在我必须将树或一部分将树传递给函数等时无用复制。
  4. 使用实时后端到SQLITE(或类似)数据库,并在运行时查询。这将避免一次加载整棵树并将其保存在RAM中。
  5. 在文件系统上使用平面文件和目录结构;尽管我认为这引入了比必要的更多麻烦,因为没有办法存储有关对象的元信息。

编辑

我遇到的下一个问题是用户可能想编辑整个树结构。他想单击组或脚本,编辑脚本代码,并可能在树中周围拖放目录和脚本;因此,在途中改变了整棵树的结构。

这引起了以下问题:

  1. 如果用户关闭编辑器,那么向他提供一个“您想保存更改?”可能是一个好主意。对话。就像文本编辑器一样,您会意外地将某些内容键入现有文档,但是您在不保存更改的情况下退出。 - 这将要求我们编辑整个树的副本,并在需要时覆盖应用程序中的现有树。
  2. 允许拖放可能是有问题的...
    • ...与 存储方法#1: :目前,不存在更改Qobjects子女的顺序的好方法。同样在运行时移动对象,而程序的其他部分可能会访问它们,这不是一个好主意。
    • ...这很容易 存储方法2, ,由于整棵树像单个价值一样处理,而且我不得不移动和父母。复制树的一部分会自动复制所有孩子,依此类推。不幸的是,这意味着灵活性的开销和损失很大(我不得不再次将整棵树写在磁盘上,因为我不能确定到底发生了什么变化)。

当我想到更多事情时,我可能会有所更新这个问题,但是我真的很好奇其他人如何解决这个问题。任何建议和想法都将受到赞赏。 :)

有帮助吗?

解决方案 2

到目前为止,我通过使用专用类限制树的深度来解决问题。这意味着只有有限的树深度需要处理,因此现在我只使用QtreetReeWidget和一些允许分类,拖动和其他不错功能的帮助方法。

其他提示

我建议您看看Qfilesystemmodel的良好实践。该模型应使用单独的线程以进行UI响应能力,保持缓存等等。表现良好的模型还应该使您在编辑器上的作品更加容易。

我还将去派生以创建您的TreeItem类的QoBject。与QSHAREDDATA共享数据的共享数据将是不错的。我也有订单的财产。这样,当用户以任何其他方式拖动和掉落或更改订单时,您都可以保持控制。由于共享数据,因此将自己的对象列表保留在您的绩效订单下,几乎没有成本。

另外,看看 模型测试.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top