1

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

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

数据类/存储

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

  1. 使用可以使用 QObject 的父/子功能表示树的 QObject 派生类。这样,如果它们的父对象被删除,我就不必担心删除这些对象。
  2. 使用一个简单的类,它可能包含一个 QList(没有指针)的子级和一些存储每个组/脚本的属性的属性。
  3. 使用方法#2,但使用指针而不是静态对象 - 当我必须将组或树的一部分传递给函数等时,这将避免无用的复制。
  4. 使用 SQLite(或类似)数据库的实时后端,并在运行时查询它。这将避免一次加载整个树并将其保存在 RAM 中。
  5. 在文件系统上使用平面文件和目录结构;尽管我认为这会带来不必要的麻烦,因为无法存储有关对象的元信息。

编辑

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

这会引发以下问题:

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

当我想到更多事情时,我可能会稍微更新一下这个问题,但我真的很好奇其他人是如何解决这个问题的。任何建议和想法表示赞赏。:)

4

2 回答 2

2

我建议您查看 QFileSystemModel 以获得良好实践。模型应该使用一个单独的线程来更新自己,以实现 UI 响应、保持缓存等。一个表现良好的模型还应该使您在编辑器上的工作更容易。

我也会去派生 QObject 来创建你的 TreeItem 类。使用 QSharedData 作为基类的共享数据方法会很好。我也有它的订单的财产。这样,当用户以任何其他方式拖放或更改顺序时,您就有办法保持控制。由于数据是共享的,因此将您自己的对象列表保持在您的性能顺序中几乎没有成本。

另外,看看ModelTest

于 2009-12-11T01:23:57.573 回答
0

到目前为止,我通过使用专用类限制树的深度解决了这个问题。这意味着只需要处理有限的树深度,所以现在我只使用 QTreeTreeWidget 和一些允许排序、拖放和其他不错的功能的辅助方法。

于 2009-12-20T15:42:14.723 回答