2009-12-10 25 views
1

我有一个稍微棘手的问题要解决;想象一下:最优雅/安全/简单的解决方案来存储和编辑(GUI)类似目录的树结构?

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

数据类/存储

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

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

编辑

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

这就提出了以下问题:

  1. 如果用户关闭了编辑器,它可能是一个好主意,为他提供“你想保存更改?”对话。就像一个文本编辑器,您偶然将某些内容输入到现有文档中,但您不保存更改而退出。 - 这需要我们编辑整个树的副本,并在需要时覆盖应用程序中的现有树。
  2. 允许将&下降可能是有问题的......
    • ...与存储方法#1:目前还没有很好的方式中存在改变的QObject的孩子的顺序。同时在运行时移动对象而程序的其他部分可能会访问它们不是一个好主意。
    • ...这更容易与存储方法#2,因为整个树被处理像一个单一的价值观,没有孩子,我不得不移动和重新父母。复制树的一部分会自动复制所有孩子等等。不幸的是,这意味着很多开销和灵活性的损失(我不得不将整个树写入磁盘,因为我无法确定究竟发生了什么变化)。

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

回答

0

现在我通过使用专用类来限制树的深度来解决问题。这意味着只有有限的树深度需要处理,所以现在我只需使用QTreeTreeWidget和一些辅助方法,这些方法允许排序,拖动和其他很好的功能。

2

我建议你看看QFileSystemModel的良好做法。该模型应该使用单独的线程来更新自己的UI响应能力,保持缓存等等。一个表现良好的模型也应该使你在编辑器上的工作更容易。

我也想去派生QObject来创建你的TreeItem类。与QSharedData共享一个基类的数据aproach将会很好。我也有它的订单属性。通过这种方式,当用户通过其他方式拖动和放下或更改顺序时,您可以保持控制权。由于数据是共享的,因此在订单中保留自己的对象列表以实现性能的成本很低。

另外,请看ModelTest