我有一个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);
}
如何解决?
答案 0 :(得分:1)
您引用的答案充其量是令人困惑的,而且可能是错误的。
您的模型代码需要针对模型dataChanged
方法返回的数据已更改的任何矩形单元格发出data
信号。例如,请参见this问答,其中有一些细节。
请注意,dataChanged
信号中的参数不应为父项和子项,而应为“ topLeft”和“ bottomRight”。他们需要有相同的父母,也必须有所不同。因此,您无需遍历行并为每一行发出信号。您可以为所有已更改的行发送组合信号。
但是您确实需要为每个父级(数据已更改)发送一个信号,以信号通知该父级的左上单元格和右下单元格。因此,您可能最终在(0, 0, parent)
处为该父级的左上角单元格创建了一个索引,并在(rows, cols, parent)
处为右下角单元格创建了另一个索引,然后为该对索引发送信号。