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