如何刷新Qt中的TreeModel?

问题描述 投票:1回答:1

我有一个TreeModel,其中加载了一些数据。我的应用程序中有一个单选按钮,单击该按钮时,应使用新数据更新TreeModel

我在切换单选按钮时尝试了以下操作,但没有一个正常工作:

  • 发出layoutChanged emit layoutChanged();
  • 发出dataChanged emit dataChanged(QModelIndex(), QModelIndex());

参考自:

What does 'bottomRight' mean when using dataChanged() with a QTreeView in Qt?

  • 递归访问树中的每个节点并发出dataChanged void TreeView::getLastExpandedState(const QModelIndex& parent) { bool isExpand = isExpanded(parent); if (!isExpand) { return; } int rows = model()->rowCount(parent); for (int rowNum = 0; rowNum < rows ; ++rowNum) { QModelIndex childIndex = model()->index(rowNum, 0, parent); model->emitChange(parent,childIndex); getLastExpandedState(childIndex); } } void TreeModel::emitChange(const QModelIndex& parent,const QModelIndex& childIndex) { emit dataChanged(parent,childIndex); }

怎么解决?

qt qtreeview qabstractitemmodel
1个回答
1
投票

你提到的答案充其量是混乱而且可能是错误的。

您的模型代码需要为任何单元格矩形发出dataChanged信号,其中模型data方法返回的数据已更改。例如,请参阅this问题和答案,其中详细介绍了一些问题。

请注意,dataChanged信号中的参数不应该是父级和子级 - 它们应该是“topLeft”和“bottomRight”。他们需要拥有相同的父母,也需要与众不同。因此,您不需要遍历行并为每行发出信号。您可以为已更改的所有行发送组合信号。

但是,您确实需要为每个父级(数据已更改)发送信号,该信号表示该父级的左上角单元格和右下角单元格。因此,您可能最终在(0, 0, parent)为该父级创建左上角单元格的索引,在(rows, cols, parent)为右下角单元格创建另一个索引,然后为该对索引发送信号。

© www.soinside.com 2019 - 2024. All rights reserved.