Qt模型测试,removeRows

问题描述 投票:0回答:1

我有一个树模型,其内部结构类似于Simple Tree Model Example。有一个特殊的数组类型的项目,我想要显示一个索引。我的数据方法如下所示:

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 ) ) );
}

将删除前的值与删除后的值进行比较。在我的情况下,因为我也显示索引,它们不匹配。例如,我在模型中有Item1Item2。如果Item1被删除,那么Item2变成Item1并且测试失败。

我的问题是我的模型实现有问题吗?我应该区别对待这种情况吗?

c++ qt model-view-controller qt5 qtestlib
1个回答
1
投票

QAbstractItemModel中的数据不能只是默默地更改。您应该始终为数据已更改的索引发出dataChanged信号。

如果你这样做:

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

那么你需要在每次childNumber()改变时发出dataChanged信号。因此,只有通过QAbstractItemModel :: setData才能更改索引数据会容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.