QSortFilterProxyModel:源模型报告的不一致更改
QSortFilterProxyModel: inconsistent changes reported by source model
所以我有一个 QTreeView 小部件,它有一个自定义 QSortFilterProxyModel 作为源模型,它本身包装了一个名为:sourceModel
.
的自定义 QAbstractItemModel
我的树显示文件和文件夹。如果文件删除后文件夹为空,则该文件夹会自动删除。执行如下:
bool sourceModel::removeRows(int row, int count, const QModelIndex& parent)
{
if (parent.isValid())
{
auto parent_node = static_cast<Node*>(parent.internalPointer());
if (!parent.data(rootNode).toBool())
{
beginRemoveRows(parent, row, row + count - 1);
for (int i = 0; i < count; ++i)
parent_node->removeChild(row + i);
endRemoveRows();
if (parent_node->isType<Folder>() && parent_node->children() == 0)
{
removeRows(parent_node->row(), 1, parent.parent());
}
return true;
}
}
}
当通过代理模型调用 removeRows 时,这工作正常,但在另一个实例中,当 sourceModel 直接调用 removeRows 时,我得到:
QSortFilterProxyModel: inconsistent changes reported by source model
好像 QSortFilterProxyModel 没有正确接收或处理 beginRemoveRows/endRemoveRows。
我已经解决了这个问题,修复与模型本身无关,发布的代码工作正常。我直接从上下文菜单工作流调用一个方法,这导致了代理模型和选择模型之间的某种竞争条件。
所以我有一个 QTreeView 小部件,它有一个自定义 QSortFilterProxyModel 作为源模型,它本身包装了一个名为:sourceModel
.
我的树显示文件和文件夹。如果文件删除后文件夹为空,则该文件夹会自动删除。执行如下:
bool sourceModel::removeRows(int row, int count, const QModelIndex& parent)
{
if (parent.isValid())
{
auto parent_node = static_cast<Node*>(parent.internalPointer());
if (!parent.data(rootNode).toBool())
{
beginRemoveRows(parent, row, row + count - 1);
for (int i = 0; i < count; ++i)
parent_node->removeChild(row + i);
endRemoveRows();
if (parent_node->isType<Folder>() && parent_node->children() == 0)
{
removeRows(parent_node->row(), 1, parent.parent());
}
return true;
}
}
}
当通过代理模型调用 removeRows 时,这工作正常,但在另一个实例中,当 sourceModel 直接调用 removeRows 时,我得到:
QSortFilterProxyModel: inconsistent changes reported by source model
好像 QSortFilterProxyModel 没有正确接收或处理 beginRemoveRows/endRemoveRows。
我已经解决了这个问题,修复与模型本身无关,发布的代码工作正常。我直接从上下文菜单工作流调用一个方法,这导致了代理模型和选择模型之间的某种竞争条件。