Переупорядочить элементы в дереве - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу иметь возможность изменить порядок элементов в своем дереве, и я в некоторой степени достиг этого следующим образом:

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 в другой и не иметь возможности перетаскивать корни внутри детей.

Есть ли способ сделать это?

...