动态树模型(Qt)

动态树模型(Qt),qt,qt4,pyqt4,pyside,qabstractitemmodel,Qt,Qt4,Pyqt4,Pyside,Qabstractitemmodel,我使用一个qabstractemodel来表示一个树模型(最多包含几个被追踪的项)。数据本身是动态的,在任何时候节点可能出现或消失,值(或其他角色)可能会改变 对模型进行更改很容易;我想知道如何有效地发出信号,以便通知QTreeView更改(它的大多数节点都已折叠) 在任何给定时间,都可能同时发生多个更改(行插入和/或删除) 使用beginInsertRows/endInsertRows/beginRemoveRows/endRemoveRows-是否应该有一种方法来通知视图多个更改 就绩效而言

我使用一个
qabstractemodel
来表示一个树模型(最多包含几个被追踪的项)。数据本身是动态的,在任何时候节点可能出现或消失,值(或其他角色)可能会改变

对模型进行更改很容易;我想知道如何有效地发出信号,以便通知QTreeView更改(它的大多数节点都已折叠)

在任何给定时间,都可能同时发生多个更改(行插入和/或删除)

  • 使用
    beginInsertRows
    /
    endInsertRows
    /
    beginRemoveRows
    /
    endRemoveRows
    -是否应该有一种方法来通知视图多个更改
  • 就绩效而言,最好的策略是什么?例如,从叶子开始到根/对于每个节点-从下到上(vs从上到下)/插入前删除/等等
  • beginResetModel
    /
    endResetModel
    是否一定效率较低
  • 使用
    QStandardItemModel
    有什么好处吗?(针对本特定案例)
  • 对。通知每个人不相交的删除/添加的方法是发出多个信号。在大多数情况下,传递一些复杂的数据结构(而不仅仅是父索引和分隔行/列索引)会导致更大的开销

  • 您应该只通知删除/添加靠近根目录的项。如果孩子的父母随后将消失,那么通知他们将孩子带走是没有意义的。关于父母的通知意味着孩子们显然已经不在了

  • 这不仅关乎效率,也关乎国家。模型重置将重置视图状态。在收到重置后,视图只能假设它得到了一个全新的、不相关的模型-因此您会丢失选择、展开/折叠状态等。视图在重置时无法以任何其他方式进行操作。否则,视图将需要保留其自己的模型内容副本

    由于模型重置意味着所有项目的重新发布,而且这可能是一件非常昂贵的事情,因此,只有在合计超过50%的原始项目发生更改(删除/替换/添加)时,才应执行此操作

  • 不,这没有什么好处,除非您将数据存储为变体,否则使用
    QStandardItemModel
    将始终导致更大的内存开销。这是一个方便的类,如果它完全符合您的需要,它是有意义的。事实上,如果你对如何使用它不小心,它的效果会更糟

    例如,如果您通过迭代深度优先并首先删除最远的子项来删除项,那么
    QStandardItemModel
    无法预见未来-即,您确实希望删除所有这些子项的共同祖先,并将不必要地发出大量更改事件。您可以在自己的模型中正确地处理它,或者如果您只是删除公共父对象而不涉及子对象,因为它们也将被隐式删除