Qt 如果没有实际插入,调用QAbstractItemModel::beginInsertRows()和endInsertRows()会有什么效果?

Qt 如果没有实际插入,调用QAbstractItemModel::beginInsertRows()和endInsertRows()会有什么效果?,qt,Qt,我正在我的模型中实现拖放行为,它是从QabstracteModel派生的。我的drop事件代码(C++)如下所示: beginInsertRows(destination_index, row, row); destination->AcquireDroppedComponent(component); endInsertRows(); 对AcquireDroppedComponent的调用可能会由于多种原因而失败并拒绝删除,在这种情况下,将不会在存储在destination\u ind

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

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

AcquireDroppedComponent
的调用可能会由于多种原因而失败并拒绝删除,在这种情况下,将不会在存储在
destination\u index
中的索引中插入新行。我的问题是,如果发生这种情况,调用begin/endInsertRows是否会导致问题?到目前为止,我在Windows7上进行的有限测试没有显示出任何不良行为,但我希望进行彻底的测试,不依赖于某个平台的特定行为。我可以事先检查drop是否成功,但如果可以的话,我希望避免额外的代码。我的问题也适用于其他开始/结束函数,如
beginremoverws
beginInsertColumns
,等等。

在不执行您指示的操作的情况下调用这些方法会破坏它们的契约。您的模型的客户机将如何处理这一问题基本上还没有定义

我可以事先检查drop是否成功,但如果可以的话,我希望避免额外的代码

“额外”代码是绝对必要的

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

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

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

这是一个优雅的解决方案。谢谢