QAbstractItemModel + ModelTest :: rowsInserted ASSERTion问题

时间:2011-09-15 23:17:24

标签: c++ qt qt4 qabstractitemmodel

我正在尝试使用ModelTest调试我的模型(QAbstractItemModel)。我无法理解一个断言。

ModelTest中有两个插槽拦截我的模型生成的信号。

  1. MODELTEST :: rowsAboutToBeInserted
  2. MODELTEST :: rowsInserted
  3. 插槽/功能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需要

      

    model-> data(model-> index(start,0,parent))

    等于

      

    model-> data(model-> index(end + 1,0,c.parent))

    我在这里缺少什么?请帮助:)

1 个答案:

答案 0 :(得分: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(因为它们应该)断言成功,那么即使在当前插入后没有行的情况下也提供一定程度的错误检查。