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