QAbstractItemModel + ModelTest :: rowInserted Проблема ASSERTion - PullRequest
2 голосов
/ 16 сентября 2011

Я пытаюсь отладить мою модель (QAbstractItemModel) с помощью ModelTest. И я не могу понять одно утверждение.

В ModelTest есть два слота, которые перехватывают сигналы, генерируемые моей моделью.

  1. ModelTest :: rowsAboutToBeInserted
  2. ModelTest :: rowsInserted

Слот / функция 1 выглядит так

void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int end )
{
    Changing c;
    // ...
    c.last = model->data ( model->index ( start - 1, 0, parent ) );
    c.next = model->data ( model->index ( start, 0, parent ) );
    insert.push ( c );
}

И слот 2 выглядит так

void ModelTest::rowsInserted ( const QModelIndex & parent, int start, int end )
{
    Changing c = insert.pop();

    // other asserts ...

    (*) Q_ASSERT ( c.next == model->data ( model->index ( end + 1, 0, c.parent ) ) );
}

Я не понимаю последнее утверждение (*). Предположим, что в моем приложении я добавляю 1 строку. Эта строка является единственной строкой, которая хранится в моей модели. Таким образом, номер строки будет 0.

В моей модели перед добавлением строки я звоню

beginInsertRows(parentIndex, 0, 0);

Так почему же для тестирования модели требуется

модель-> данные (модель-> индекс (начало, 0, родитель))

будет равно

модель-> данные (модель-> индекс (конец + 1, 0, c.parent))

Что мне здесь не хватает? Пожалуйста, помогите:)

1 Ответ

1 голос
/ 16 сентября 2011

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

c.next = model->data ( model->index ( start, 0, parent ) );

и

Q_ASSERT ( c.next == model->data ( model->index ( end + 1, 0, c.parent ) ) );

должен вернуть недействительный (пустой) QVariant. Если оба возвращают пустой QVariant (как они должны), утверждение успешно выполняется, что обеспечивает некоторый уровень проверки ошибок даже в случае отсутствия строк после текущей вставки.

...