У меня есть 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...
Все, что помечено как перетаскиваемое, можно перетаскивать. Все, что помечено как родительское, может иметь перетаскиваемый элемент в качестве дочернего. Все, что отмечено как исправленное, исправлено.
Мой вопрос в том, как я могу ограничить удаление элемента, чтобы он оставался внутри определенного родителя? Например, я мог бы перетащить «bloodOrange» и сделать его потомком «apple» или «апельсина» (или даже просто изменить его порядковое положение внутри «Fruit»), но я не смог бы сделать его потомком моркови. или салат и т.д.
Мне удалось правильно закодировать флаги для всего, кроме той части, которая ограничивает операцию отбрасывания, чтобы она оставалась внутри определенного родителя. Я просто не знаю, как захватить текущий перетаскиваемый QModelIndex (из которого я могу определить родителя, дедушку и бабушку и т. д.)
Спасибо!
Вот мой код для метода флагов на случай, если это поможет: Примечание. Я называю дочерние элементы верхнего уровня узлами (т. е. «Еда»), следующий уровень — группами (т. е. «Фрукты») и последние два уровня (т. е. «Фрукты»). lettuce и icebergLettuce) являются Params.
#---------------------------------------------------------------------------
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