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

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

  • ModelTest::rowsAboutToBeInserted
  • ModelTest::rows插入

  • 插槽/功能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);
    

    那么为什么模型测试需要



    等于



    我在这里想念什么?请帮忙 :)

    最佳答案

    该断言背后的想法是检查添加的行之后的第一行是否正确移动。如果在插入的行之后有一些行,则将比较它们的数据。如果没有,则您的模型都应在线

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

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

    应该返回无效(空)的QVariant。如果两者都返回空的QVariant(如应有的那样),则断言成功,因此即使在当前插入后没有行的情况下,也可以提供一定程度的错误检查。

    关于c++ - QAbstractItemModel + ModelTest::rowsInserted ASSERTion问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7438539/

    10-10 21:38