我在我的模型中实现了拖放行为,这是从QAbstractItemModel派生的。 drop事件的代码(C ++)如下所示:
beginInsertRows(destination_index, row, row);
destination->AcquireDroppedComponent(component);
endInsertRows();
对AcquireDroppedComponent
的调用可能由于多种原因而失败并拒绝丢弃,在这种情况下,destination_index
中存储的索引中不会插入新行。我的问题是如果发生这种情况,调用begin / endInsertRows会导致问题吗?到目前为止,我对Windows 7的有限测试显示没有不良行为,但我想要彻底而不依赖于一个平台的特定行为。我可以事先检查掉落是否成功,但如果可以,我想避免额外的代码。我的问题也适用于beginRemoveRows
,beginInsertColumns
等其他开始/结束功能。
答案 0 :(得分:3)
调用这些方法而不执行您指定的操作会破坏合同。模型的客户如何应对这种情况基本上是未定义的。
我可以事先检查掉落是否成功,但如果可以,我想避免额外的代码。
那"额外"代码是绝对必要的。
我重构您的代码以分别执行采集和模型更改:
if (destination->acquireDroppedComponent(component)) {
beginInsertRows(destination_index, row, row);
destination->insertDroppedComponent(component);
endInsertRows();
}
acquireDroppedComponent
将存储已删除对象的数据而不修改模型,如果成功且数据可用,则返回true
。然后,您可以调用insertDroppedComponent
来执行模型更改。