Тест Qt Model, removeRows - PullRequest
       59

Тест Qt Model, removeRows

0 голосов
/ 05 марта 2019

У меня есть модель дерева с внутренней структурой, похожей на Пример простой модели дерева . Есть специальные элементы массива типа, для которых я хочу отобразить индекс. Мой метод данных выглядит так:

QVariant Model::data(const QModelIndex & index, int role ) const
{
    if (!index.isValid())
        return QVariant();

    TreeNode *item = getItem(index);

    if (role == Qt::DisplayRole) {
        return item->text();
    }
    ...

    return QVariant();
}

const QString TreeNode::text() const
{
    if (array) {
        return name() + " [" + QString::number(childNumber()) + "]";
    }
    return mText;
}

У меня есть модульный тест, который выполняет удаление узла, который использует Model Test . Проблема возникает в последней строке этого теста

void ModelTest::rowsRemoved ( const QModelIndex & parent, int start, int end )
{
    Changing c = remove.pop();
    QVERIFY( c.parent == parent );
    QVERIFY( c.oldSize - ( end - start + 1 ) == model->rowCount ( parent ) );
    QVERIFY( c.last == model->data ( model->index ( start - 1, 0, c.parent ) ) );
    QVERIFY( c.next == model->data ( model->index ( start, 0, c.parent ) ) );
}

, который сравнивает значение до удаления со значением после удаления. В моем случае, так как я также отображаю индексы, они не совпадают. Например, у меня были Item1 и Item2 в модели. Если Item1 удалено, то Item2 становится Item1, и тест не пройден.

У меня вопрос, что-то не так в моей реализации модели? Должен ли я справиться с этой ситуацией по-другому?

1 Ответ

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

Данные в QAbstractItemModel нельзя просто изменить молча. Вы всегда должны генерировать сигнал dataChanged для индексов, данные которых изменились.

Если вы сделаете это:

" [" + QString::number(childNumber()) + "]"

тогда вы должны генерировать сигнал dataChanged каждый раз, когда childNumber () изменяется. Так что было бы гораздо проще, если данные индекса можно было изменить только через QAbstractItemModel :: setData.

...