Qt中如何刷新TreeModel?
How to refresh TreeModel in Qt?
我有一个 TreeModel
,其中加载了一些数据。我的应用程序中有一个单选按钮,单击该按钮时应使用新数据更新 TreeModel
。
我在切换单选按钮时尝试了以下操作并且 none 正在工作:
发出layoutChanged
emit layoutChanged();
发出dataChanged
emit dataChanged(QModelIndex(), QModelIndex());
引用自:
递归访问树中的每个节点并发出 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);
}
如何解决?
您引用的答案充其量只是令人困惑,而且可能是错误的。
您的模型代码需要为模型 data
方法返回的数据已更改的任何矩形单元格发出 dataChanged
信号。例如,请参阅 this 问答,其中有一些细节。
请注意,dataChanged
信号中的参数不应该是 parent 和 child - 它们应该是 "topLeft" 和 "bottomRight"。他们需要具有相同的 parent 并且也需要不同。因此,您无需遍历行并为每一行发出信号。您可以为所有已更改的行发送组合信号。
但是您确实需要为每个 parent(数据发生变化的地方)发送一个信号,向 parent 的左上角单元格和右下角单元格发出信号。因此,您最终可能会为 (0, 0, parent)
处的 parent 左上角单元格创建一个索引,并为 (rows, cols, parent)
处右下角的单元格创建另一个索引,然后为这对索引发送信号。
我有一个 TreeModel
,其中加载了一些数据。我的应用程序中有一个单选按钮,单击该按钮时应使用新数据更新 TreeModel
。
我在切换单选按钮时尝试了以下操作并且 none 正在工作:
发出
layoutChanged
emit layoutChanged();
发出
dataChanged
emit dataChanged(QModelIndex(), QModelIndex());
引用自:
递归访问树中的每个节点并发出 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); }
如何解决?
您引用的答案充其量只是令人困惑,而且可能是错误的。
您的模型代码需要为模型 data
方法返回的数据已更改的任何矩形单元格发出 dataChanged
信号。例如,请参阅 this 问答,其中有一些细节。
请注意,dataChanged
信号中的参数不应该是 parent 和 child - 它们应该是 "topLeft" 和 "bottomRight"。他们需要具有相同的 parent 并且也需要不同。因此,您无需遍历行并为每一行发出信号。您可以为所有已更改的行发送组合信号。
但是您确实需要为每个 parent(数据发生变化的地方)发送一个信号,向 parent 的左上角单元格和右下角单元格发出信号。因此,您最终可能会为 (0, 0, parent)
处的 parent 左上角单元格创建一个索引,并为 (rows, cols, parent)
处右下角的单元格创建另一个索引,然后为这对索引发送信号。