PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

一、属性的作用

dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖,如果其值为False,则拖拽的数据将作为新项插入。当DropAction对应动作为拷贝时,上述拖放的源数据保持不变,而DropAction对应动作为移动数据时,上述拖放的源数据会被删除。

默认值为False,如子类QListView和QTreeView就是这样。而在QTableView子类中,该属性设置为True。

二、访问方法

dragDropOverwriteMode() 、setDragDropOverwriteMode(bool overwrite)这两个方法用于访问和设置该属性。

三、补充说明

1、关于拖放以及拖放响应相关方面的内容,老猿做了很多测试,对于dragDropOverwriteMode属性,上面介绍的关于拖放数据释放处的处理是官网上原文翻译的,关于源数据的处理部分则与官网说法有些不同,是老猿根据测试情况理解后写的,原文不太好理解;
2、关于拖放数据放下后的处理,老猿使用ListView与TableView测试的情况与上述说法有些不一致,并且遇到了些问题,具体测试差异如下:

  • dragDropOverwriteMode为True时,拖放数据如果在视图最后面释放,则会添加到视图最后面,但在数据项之上释放时,发现无法覆盖,数据行之间释放时也不会执行插入,即此种情况下,只有在视图最后进行释放时数据会添加到视图最后,其他情况下释放处的数据都没有变化
  • dragDropOverwriteMode为False时,拖放数据如果在视图最后面或不同行之间释放,则会在释放处插入拖放数据

另外,在做《PyQt(Python+Qt)学习随笔:QAbstractItemView的showDropIndicator属性》相关测试时,发现可以实现官网上实现的功能,即在数据项上释放时能按官网说明(也即上面第一部分介绍)进行释放处理,但在本部分除dragDropOverwriteMode外其他多个属性(包括dragDropMode、defaultDropAction、selectionMode、selectionBehavior、editTriggers等)各种取值测试也没有重现该覆盖功能,可能组合覆盖不全,具体原因老猿还未弄清楚。

修订:

经反复测试,最终验证上述问题产生的原因是由于对应的model不支持覆盖写导致的。因此关于dragDropOverwriteMode属性的功能,描述如下:

dragDropOverwriteMode属性用于控制视图的拖放行为:

  • 如果其值为True,且视图对应存储支持,则视图中拖放的数据将在拖拽数据放下时覆盖放下处的数据
  • 如果其值为False,且视图对应存储支持,则拖拽的数据将作为新项插入。
    当DropAction对应动作为拷贝时,上述拖放的源数据保持不变,而DropAction对应动作为移动数据时,上述拖放的源数据会被删除。

老猿Python,跟老猿学Python!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/12235152.html