- элементы верхнего уровня можно перемещать только таким образом, чтобы менялся только их порядок, оставаясь при этом на верхнем уровне< /li>
Дочерние элементы можно перемещать только в пределах иерархии родительского элемента верхнего уровня.
Вот упрощенная версия моей текущей реализации. Проблема в том, что код позволяет перемещать дочерний элемент за пределы его элемента верхнего уровня, и порядок элементов верхнего уровня не может быть изменен.
from PyQt5.QtWidgets import QApplication, QTreeView, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtGui import QStandardItem, QStandardItemModel
class MyTreeView(QTreeView):
def dropEvent(self, e):
currentIndex = e.source().currentIndex()
destinationIndex = self.indexAt(e.pos())
# Check if the dragged item is a root item
if not currentIndex.parent().isValid():
# Check if the drop destination is a root item
if not destinationIndex.parent().isValid():
# Ignore the drop if both are root items
e.ignore()
return
super().dropEvent(e)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.tree_view = MyTreeView(self)
self.tree_view.setDragEnabled(True)
self.tree_view.setAcceptDrops(True)
self.tree_view.setDropIndicatorShown(True)
self.tree_view.setDragDropMode(QTreeView.InternalMove)
self.model = QStandardItemModel()
# Create sample items
root_item1 = QStandardItem("Root Item 1")
child_item11 = QStandardItem("Child Item 1.1")
child_item12 = QStandardItem("Child Item 1.2")
root_item1.appendRow(child_item11)
root_item1.appendRow(child_item12)
root_item2 = QStandardItem("Root Item 2")
child_item21 = QStandardItem("Child Item 2.1")
child_item22 = QStandardItem("Child Item 2.2")
root_item2.appendRow(child_item21)
root_item2.appendRow(child_item22)
self.model.appendRow(root_item1)
self.model.appendRow(root_item2)
self.tree_view.setModel(self.model)
layout = QVBoxLayout()
layout.addWidget(self.tree_view)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
Подробнее здесь: https://stackoverflow.com/questions/787 ... -qtreeview