代码之家  ›  专栏  ›  技术社区  ›  BastiBen

最优雅/安全/容易存储和编辑(GUI)目录树结构的解决方案?

  •  1
  • BastiBen  · 技术社区  · 16 年前

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

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

    数据类/存储

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

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

    编辑

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

    这就产生了以下问题:

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

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Vitor Py    16 年前

    我建议你看一下QfileSystemModel的良好实践。模型应该使用一个单独的线程来更新自己,以实现UI响应、保持缓存等等。一个行为良好的模型也应该使您在编辑器上的工作更加容易。

    我还将使用派生QObject来创建TreeItem类。对于一个基类,一个与qsharedata相关的共享数据是很好的。我也会有它的财产。这样,当用户以任何其他方式拖动和删除或更改订单时,您就可以保持控制。由于数据是共享的,所以将自己的对象列表按顺序排列以获得性能所需的成本很低。

    另外,看看 ModelTest .

        2
  •  0
  •   BastiBen    16 年前

    到目前为止,我通过使用专用类限制树的深度来解决这个问题。这意味着只需要处理有限的树深度,因此目前我只使用qtreetreewidget和一些辅助方法来进行排序、拖放和其他不错的功能。