Неправильное представление пользовательской иерархической модели при установке прокси-модели, которая меняет столбцы - PullRequest
5 голосов
/ 25 ноября 2011

У меня есть пользовательская иерархическая модель, унаследованная от QAbstractModelItem. Кроме того, я реализую MySortFilterProxyModel, разделенную на подклассы из QSortFilterProxyModel. MySortFilterProxyModel может удалять и менять столбцы. Если первый столбец в MySortFilterProxyModel соответствует первому столбцу в модели, все работает нормально. Но если его поменять в прокси-модели, то возникнут некоторые проблемы с представлением: MySortFilterProxyModel :: hasChildren работает нормально, поэтому на верхнем уровне у меня есть «+» рядом с элементами, имеющими потомков. Но когда я пытаюсь развернуть его - никакие дочерние элементы не отображаются. Вот некоторые методы MySortFilterProxyModel:

    bool MySortFilterProxyModel::hasChildren(const QModelIndex &parent) const
    {
        if (parent.isValid() && parent.column() != 0)
            return false;
        QModelIndex source_parent = mapToSource(parent);
        return  sourceModel()->hasChildren( source_parent.sibling(source_parent.row(), 0) );
    }


    int MySortFilterProxyModel::rowCount(const QModelIndex &parent) const
    {
         if (parent.isValid() && parent.column() != 0)
            return 0;

        QModelIndex source_parent = mapToSource(parent);
        return sourceModel()->rowCount( source_parent.sibling(source_parent.row(), 0) );
    } 

Во время разбора я обнаружил, что MySortFilterProxyModel :: rowCount возвращает правильные данные. Но также я заметил, что MyModel :: rowCount вызывается не через MySortFilterProxyModel :: rowCount, а из QSortFilterProxyModel :: index (). Пехарпс, это проблема?

Итак, конкретный вопрос: как правильно реализовать прокси-модель для замены и отключения столбцов в иерархической модели?

Помогите, пожалуйста, решить проблему. Спасибо.

1 Ответ

4 голосов
/ 09 декабря 2011

Попробуйте использовать Qt Model Tester для получения дополнительной информации.

Это не удастся с утверждением, если что-то не так с моделями.Если утверждение не выполнено, просмотрите код проверки модели в приведенном выше комментарии, чтобы выяснить, что пошло не так.

Убедитесь, что вы подключили тестер модели к прокси-модели и источникамодель, в противном случае ошибка в исходной модели может привести к сбою прокси.

...