我是否需要通知QTableView QAbstractTableModel子类中的列数已更改?

Zek*_*eks 3 c++ qt model-view

我有自己的QAbstractTableModel子类.当新数据插入其中时 - 我发出beginInsertRows/endInsertRows,然后发出带正确索引的dataChanged.rowCount似乎被改变了,因为我看到滚动条出现并增长,但.... columnCount不是.

顺序是这样的:

1)在将模型插入tableview之前填充模型.这种方式可以捕获适当数量的列.

2)我先将模型插入视图,然后用数据填充它.在这种情况下,即使在发出dataChanged之后,视图也不会显示任何内容,因为它似乎仍然认为没有列.(coulmnCount()返回适当的金额 - 我检查了几次)

从我在Qt文档中看到的内容看起来我不需要为大多数模型手动调用beginInsertColumns ...为什么当模型接收数据时视图无法选择列数?

PS在填充模型后调用第二种情况:

view->setModel(0);
view->setModel(model);
Run Code Online (Sandbox Code Playgroud)

将列数设置为适当的值,但这很丑陋......

UPD:我发现了那个发射

emit headerDataChanged(Qt::Horizontal, 0 , columnCount());
Run Code Online (Sandbox Code Playgroud)

确实修复了列问题,但文档说我不应该........ :)

Rei*_*ica 6

模型 - 视图体系结构的语义在文档中没有很好地描述.让我试着列出基本规则.定义:

  1. 数据更改:现有项目已更改.

  2. 结构更改:添加/删除行/列.

  3. 结构变化的时间间隔:调用之间的间隔begin[Insert|Delete][Rows|Columns]()end[Insert|Delete][Rows|Columns](),并调用之间beginResetModel()endResetModel().

根据这些定义,必须具备以下内容.尊重这些规则取决于模型和视图实现.如果一方违反规则,则另一方具有未定义的行为.因此,如果您作为模型,根据规则行事,您可以期望视图也遵守它们.如果模型违反了规则,那么视图也可以自由地破坏规则,反之亦然.

  1. dataChanged信号被发射的行|存在的列,其意思是数据,这在以前没有得到改变.在没有被删除的行列上立即发出它是没有意义的,因为视图完全知道如果它愿意,它必须读取该数据.在结构更改间隔期间不得发出信号,因为视图无法对其作出反应 - 请参阅下面的#3.

  2. 只有模型调用才会考虑添加行end[Insert|Delete][Rows|Columns]().

  3. 视图在结构更改间隔期间不访问模型.

  4. 结构变化只能在结构变化区间完成.

  5. 数据的变化可以进行外部结构的变化的时间间隔.

  6. 所有非持久性索引仅在结构更改间隔之间单个时间间隔内有效.

  7. 在结构更改间隔期间,所有非持久性索引都无效.这是模型在结构变化间隔期间无法访问的简单结果:无论你有什么索引,无论如何都是无用的.

  8. 结构更改间隔开始后,所有非持久性索引都将失效.

  9. [row|column]Count(index)具有有效索引的调用保持不变,除非在影响项目的结构更改间隔期间index.

invalidated索引的含义是视图不能再使用该索引,如果它这样做则是未定义的行为.

我的预感是你的模型没有遵循上面给出的一个或多个规则,因此视图可以自由行为.这很危险.从技术上讲,该观点可能会发动核打击或格式化您的硬盘.不要掉以轻心:)