Я хочу иметь возможность изменить порядок элементов в своем дереве, и я в некоторой степени достиг этого следующим образом:
my_tree.setDragEnabled(True)
my_tree.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
my_tree.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
Однако я хотел бы ограничить это поведение только на том же уровне.
Рассмотрим следующий игрушечный пример:
from PyQt5 import QtWidgets, QtGui, QtCore
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
w = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
w.setLayout(layout)
self.setCentralWidget(w)
my_tree = QtWidgets.QTreeWidget()
layout.addWidget(my_tree)
alpha = QtWidgets.QTreeWidgetItem(my_tree, ['Alpha'])
beta = QtWidgets.QTreeWidgetItem(my_tree, ['Beta'])
alpha.addChild(QtWidgets.QTreeWidgetItem(['one']))
alpha.addChild(QtWidgets.QTreeWidgetItem(['two']))
beta.addChild(QtWidgets.QTreeWidgetItem(['first']))
beta.addChild(QtWidgets.QTreeWidgetItem(['second']))
my_tree.setDragEnabled(True)
my_tree.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
my_tree.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
my_tree.expandAll()
alpha.child(0).setSelected(True)
self.show()
app = QtWidgets.QApplication([])
window = MainWindow()
app.exec_()
В этом примере я хотел бы только поставить beta
выше alpha
и наоборот. Я также хочу то же самое для каждого дочернего элемента root, но только внутри каждого root например second
над first
и наоборот.
Вложение не должно быть разрешено (например, сделать two
дочерним элементом one
). Я также не хочу иметь возможность свободно перетаскивать детей из одного root в другой и не иметь возможности перетаскивать корни внутри детей.
Есть ли способ сделать это?