Можно ли вернуть положительное количество строк и нулевых столбцов в QAbstractItemModel? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть QAbstractItemModel с несколькими строками и 0 столбцами.Мы начали использовать класс ModelTest, и он ломается в этой модели. Документация ModelTest состояния:

Некоторые из обнаруженных условий включают в себя:

  • hasChildren () возвращает true, если rowCount () больше нуля.

Вот реализация has_children в Qt 5.11:

bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
    return (rowCount(parent) > 0) && (columnCount(parent) > 0);
}

Из этой реализации мы можем сделать вывод, что если rowCount возвращает значение больше нуля, ModelTest ожидает, что columnCount также вернет значение больше нуля.

С другой стороны:

  • Похоже, что работает правильно, когда ModelTest не задействован.
  • Не документировано в hasChildren
  • Не документировано в rowCount
  • Не документировано в columnCount
  • Предотвращает beginRemoveColumn / endRemoveColumns от удаления последнего столбца (если количество строк больше нуля).Но я думаю, что модель может быть сброшена в этой ситуации.

Итак, в конце концов, что это:

  • Не слишком ли требователен ModelTest? 1053 *
  • Я нарушаю какой-то контракт, о котором не знаю?

1 Ответ

0 голосов
/ 16 октября 2018

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

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

Так что, пока вы проверяете это и оно работает с представлениями, в которых вы его используете, это не так, но этоможет произойти сбой в любой будущей версии Qt или если он будет использоваться с пользовательскими прокси-серверами / представлениями.

Моя рекомендация будет заключаться в том, чтобы выполнить тест и переопределить метод hasChildren, чтобы он вел себя как ожидалось, просто чтобы избежать проблем вбудущее.В конце концов, даже если строки не имеют столбцов, они все еще существуют, поэтому у индекса есть дочерние элементы - эти дочерние элементы просто являются пустыми наборами данных, но они существуют!

Это также означает, что реализация Qt hasChildren «неправильно», так как они должны учитывать это в своих собственных реализациях - я думаю, что это просто упущение в их реализации, так как они не учитывали ваш вариант использования.

...