#qt #qt4 #qabstractitemmodel #qsortfilterproxymodel
#qt #qt4 #qabstractitemmodel #qsortfilterproxymodel
Вопрос:
Итак, у меня есть виджет QTreeView, который имеет пользовательскую QSortFilterProxyModel в качестве исходной модели, которая сама оборачивает пользовательскую QAbstractItemModel с именем: sourceModel
.
В моем дереве отображаются файлы и папки. Если при удалении файла папка остается пустой, она автоматически удаляется. Реализация приведена ниже:
bool sourceModel::removeRows(int row, int count, const QModelIndexamp; 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>() amp;amp; parent_node->children() == 0)
{
removeRows(parent_node->row(), 1, parent.parent());
}
return true;
}
}
}
Это отлично работает, когда removeRows вызывается через прокси-модель, но в другом случае, когда sourceModel вызывает removeRows напрямую, я получаю:
QSortFilterProxyModel: несогласованные изменения, о которых сообщает исходная модель
Как будто QSortFilterProxyModel не получает или не обрабатывает beginRemoveRows / endRemoveRows должным образом.
Ответ №1:
Я решил эту проблему, исправление не имело никакого отношения к самим моделям, и опубликованный код работает нормально. Я вызывал метод непосредственно из рабочего процесса контекстного меню, и это вызывало какое-то состояние гонки между моделью прокси и моделью выбора.
Комментарии:
1. Немного поздно, но у меня была эта проблема в прошлом. Это было связано с тем, что моя модель работала в потоке, отличном от прокси. Вы должны убедиться, что все модели / прокси / etc выполняются в главном потоке qt.
model->moveToThread(qApp->thread());