Qt 模型测试,removeRows
Qt Model Test, removeRows
我有一个内部结构类似于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 ) ) );
}
比较删除前的值和删除后的值。在我的例子中,因为我也显示索引,所以它们不匹配。例如,我在模型中有 Item1
和 Item2
。如果删除 Item1
,则 Item2
变为 Item1
并且测试失败。
我的问题是我的模型实现有问题吗?我应该以不同的方式处理这种情况吗?
QAbstractItemModel 中的数据不能静默更改。您应该始终为数据已更改的索引发出 dataChanged 信号。
如果你这样做:
" [" + QString::number(childNumber()) + "]"
然后您需要在每次 childNumber() 更改时发出 dataChanged 信号。因此,如果仅通过 QAbstractItemModel::setData.
可以更改索引数据会容易得多
我有一个内部结构类似于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 ) ) );
}
比较删除前的值和删除后的值。在我的例子中,因为我也显示索引,所以它们不匹配。例如,我在模型中有 Item1
和 Item2
。如果删除 Item1
,则 Item2
变为 Item1
并且测试失败。
我的问题是我的模型实现有问题吗?我应该以不同的方式处理这种情况吗?
QAbstractItemModel 中的数据不能静默更改。您应该始终为数据已更改的索引发出 dataChanged 信号。
如果你这样做:
" [" + QString::number(childNumber()) + "]"
然后您需要在每次 childNumber() 更改时发出 dataChanged 信号。因此,如果仅通过 QAbstractItemModel::setData.
可以更改索引数据会容易得多