QSortFilterProxyModel: несогласованные изменения, о которых сообщает исходная модель

#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());