如果实际没有插入,调用QAbstractItemModel :: beginInsertRows()和endInsertRows()会产生什么影响?

时间:2015-12-22 16:47:00

标签: qt

我在我的模型中实现了拖放行为,这是从QAbstractItemModel派生的。 drop事件的代码(C ++)如下所示:

beginInsertRows(destination_index, row, row);
destination->AcquireDroppedComponent(component);
endInsertRows();

AcquireDroppedComponent的调用可能由于多种原因而失败并拒绝丢弃,在这种情况下,destination_index中存储的索引中不会插入新行。我的问题是如果发生这种情况,调用begin / endInsertRows会导致问题吗?到目前为止,我对Windows 7的有限测试显示没有不良行为,但我想要彻底而不依赖于一个平台的特定行为。我可以事先检查掉落是否成功,但如果可以,我想避免额外的代码。我的问题也适用于beginRemoveRowsbeginInsertColumns等其他开始/结束功能。

1 个答案:

答案 0 :(得分:3)

调用这些方法而不执行您指定的操作会破坏合同。模型的客户如何应对这种情况基本上是未定义的。

  

我可以事先检查掉落是否成功,但如果可以,我想避免额外的代码。

那"额外"代码是绝对必要的。

我重构您的代码以分别执行采集和模型更改:

if (destination->acquireDroppedComponent(component)) {
  beginInsertRows(destination_index, row, row);
  destination->insertDroppedComponent(component);
  endInsertRows();
}

acquireDroppedComponent将存储已删除对象的数据而不修改模型,如果成功且数据可用,则返回true。然后,您可以调用insertDroppedComponent来执行模型更改。