QSortFilterProxyModel: противоречивые изменения, о которых сообщает исходная модель - PullRequest
0 голосов
/ 21 марта 2019

Итак, у меня есть виджет QTreeView, в котором в качестве исходной модели используется пользовательский QSortFilterProxyModel, который сам оборачивает пользовательский объект QAbstractItemModel с именем: 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:о несовместимых изменениях, о которых сообщает исходная модель

Как будто QSortFilterProxyModel не получает или не обрабатывает beginRemoveRows / endRemoveRows должным образом.

1 Ответ

1 голос
/ 22 марта 2019

Я решил это, исправление не имело никакого отношения к самим моделям, и опубликованный код работает нормально.Я вызывал метод непосредственно из рабочего процесса контекстного меню, и это вызывало какое-то состояние гонки между моделью прокси и моделью выбора.

...