2

ModelTest でモデル (QAbstractItemModel) をデバッグしようとしています。そして、私は1つの主張を理解できません。

ModelTest には、モデルによって生成された信号をインターセプトするスロットが 2 つあります。

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

dla 最後のアサーション (*) がわかりません。私のアプリで 1 行追加するとします。この行は、モデルに格納されている唯一の行です。したがって、行番号は 0 になります。

私が呼び出す行を追加する前の私のモデルで

beginInsertRows(parentIndex, 0, 0);

では、なぜ modeltest が必要なのか

モデル -> データ ( モデル -> インデックス (開始、0、親) )

に等しくなる

モデル-> データ ( モデル-> インデックス ( end + 1, 0, c.parent ) )

ここで何が欠けていますか? 助けてください :)

4

1 に答える 1

1

このアサートの背後にある考え方は、追加された行の後の最初の行が正しく移動されたかどうかを確認することです。挿入された行の後にいくつかの行がある場合、それらのデータが比較されます。何もない場合、モデルは両方とも行にある必要があります

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

そして

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

無効な (空の) QVariant を返す必要があります。両方が空の QVariant を返す場合 (当然のことですが)、アサーションは成功するため、現在挿入された後に行がない場合でも、ある程度のエラー チェックが提供されます。

于 2011-09-15T23:46:31.860 に答える