我使用Qt 4.8.6。我有一个自定义树模型(基于QAbstractItemModel
)。每个节点代表一个计算机节点,它有一个子列表和一个操作列表。如果计算机节点不是叶子,则操作列表为空。此模型与QTreeView
相关联。计算机节点位于0列中,每个操作都在一个单独的列中描述,从第一列开始。计算机节点可能变得不可用,因此我将其标记为striked字体并发出dataChanged()
。但我还必须清除其操作清单。有效的方法是什么?我认为在layoutChanged()
之后发出beginRemoveColumns()/endRemoveColumns()
是一种开销。 AFAIK,删除/插入列应该使用root QModelIndex
完成。那么,在这种情况下删除列的算法是什么?当我简单地重新计算新的列总数(称为beginRemoveColumns()
)时,删除了内部数据,称为endRemoveColumns(),然后QTreeView中的列计数没问题,但列中的单元格对于所有计算机节点都是空白的。我应该在那之后的周期中发出dataChanged()
吗?
另外我注意到当你需要插入列时(至少)使用代理模型(QSortFilterProxyModel
)是一件令人头疼的事。我想QSortFilterProxyModelPrivate::create_mapping
存储行/列数的旧值。这就是为什么使用树模型直接与beginInsertColumns()/endInsertColumns()
对一起工作的原因,但包括代理需要在layoutChanged()
对之后发出beginInsertColumns()/endInsertColumns()
。
在layoutChanged()
或endInsertColumns()
安全的持久索引之后发出endRemoveColumns()
吗?