C++ qabstractemmodel+;ModelTest::行插入的断言问题

C++ qabstractemmodel+;ModelTest::行插入的断言问题,c++,qt,qt4,qabstractitemmodel,C++,Qt,Qt4,Qabstractitemmodel,我正在尝试用ModelTest调试我的模型(QabstracteModel)。我一句话也听不懂 ModelTest中有两个插槽用于截取模型生成的信号 ModelTest::rowsAboutToBeInserted ModelTest::行插入 插槽/函数1如下所示 void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int end ) { Changing c; //

我正在尝试用ModelTest调试我的模型(QabstracteModel)。我一句话也听不懂

ModelTest中有两个插槽用于截取模型生成的信号

  • ModelTest::rowsAboutToBeInserted
  • ModelTest::行插入
  • 插槽/函数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 );
    }
    
    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 ) ) );
    }
    
    插槽2看起来像这样

    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 );
    }
    
    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最后的断言(*)。假设我在应用程序中添加了一行。 此行是存储在我的模型中的唯一一行。所以行号应该是0

    在添加我调用的行之前,在我的模型中

    beginInsertRows(parentIndex, 0, 0);
    
    那么,为什么modeltest需要

    模型->数据(模型->索引(开始,0,父级))

    等于

    模型->数据(模型->索引(结束+1,0,c.parent))


    我错过了什么?请帮助:)

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

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

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

    应返回无效(空)QVariant。如果两者都返回空的QVariant(正如它们应该返回的那样),则断言成功,从而提供某种程度的错误检查,即使当前插入后没有行。

    非常感谢,您如何知道这一点?有关于ModelTest的教程吗?:)据我所知,没有深入理解qt的手册或教程——我的知识来自于在qt中编程几年,并且经常通过qt源代码检查事情是如何完成的。@DavidRichardson在和上有官方教程,一些信息在相关的类文档中给出,还有一些(令人惊讶地)在其他类文档中(如QabstracteModel文档中有关代理模型的信息)。有一些关于这个主题的博客系列,你也可以搜索,比如“可爱的模特发烧友”(耶)。