有效删除QTreeView的列

时间:2015-12-14 04:48:13

标签: qt4 qtreeview qabstractitemmodel

我使用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()吗?

0 个答案:

没有答案