我有一个 QTreeView,我在其中实现了拖放以允许重新排序项目。
给定以下树的示例:
Food <--fixed
|--Vegetables <--fixed
| |--carrots <-- draggable/parentable
| |--lettuce <-- draggable/parentable
| | |--icebergLettuce <-- draggable but NOT parentable
|--Fruit <-- fixed
| |--apple <-- draggable/parentable
| |--orange <-- draggable/parentable
| |--bloodOrange <-- draggable/parentable
etc...
任何标记为可拖动的东西都可以被拖动。任何标记为 parentable 的东西都可能有一个可拖动的项作为子项。任何标记为固定的东西都是固定的。
我的问题是,我将如何限制物品的丢弃以留在特定的父母中?例如,我可以拖动 'bloodOrange' 并使其成为 'apple' 或 'orange' 的孩子(或者甚至只是更改其在 'Fruit' 中的序号位置),但我不应该让它成为胡萝卜的孩子或生菜等
我已经成功地为除了限制放置操作以保持在特定父级中的部分之外的所有内容正确编码了标志。我只是不知道如何捕获当前拖动的 QModelIndex (从中我可以确定父母、祖父母等)
谢谢!
这是我的 flags 方法的代码,以防它有帮助: 注意:我将顶级子级称为节点(即“食物”),下一个级别称为组(即“水果”),最后两个级别(即lettuce 和 icebergLettuce) 都是参数。
#---------------------------------------------------------------------------
def flags(self, index):
"""
Returns whether or not the current item is editable/selectable/etc.
"""
if not index.isValid():
return QtCore.Qt.ItemIsEnabled
#by default, you can't do anything
enabled = QtCore.Qt.NoItemFlags
selectable = QtCore.Qt.NoItemFlags
editable = QtCore.Qt.NoItemFlags
draggable = QtCore.Qt.NoItemFlags
droppable = QtCore.Qt.NoItemFlags
#get a pointer to the referenced object
item = index.internalPointer()
#only 'valid' cells may be manipulated ('valid' is defined by the obj)
if item.column_is_valid(index.column()):
#all valid cells are selectable and enabled
selectable = QtCore.Qt.ItemIsSelectable
enabled = QtCore.Qt.ItemIsEnabled
#column 0 cells may occasionally be dragged and dropped
if index.column() == 0:
#drag/drop is only possible if it is a param...
if item.get_obj_type() == 'param':
#...and then only child-less params may be dragged...
if item.get_child_count() == 0:
draggable = QtCore.Qt.ItemIsDragEnabled
#...and only params with a group as parent may be dropped on
if item.get_parent().get_obj_type() == "group":
droppable = QtCore.Qt.ItemIsDropEnabled
#all other valid columns > 0 may be edited (no drag or drop)
else:
editable = QtCore.Qt.ItemIsEditable
#return our flags.
return enabled | selectable| editable| draggable| droppable