Запретить перетаскивание корневых элементов на другой корневой элемент в PyQt5 QTreeViewPython

Программы на Python
Anonymous
Запретить перетаскивание корневых элементов на другой корневой элемент в PyQt5 QTreeView

Сообщение Anonymous »

Я работаю над приложением PyQt5, в котором у меня есть QTreeView, заполненный QStandardItemModel. Корневые элементы должны быть перетаскиваемыми и перемещаться в иерархии древовидного представления. Но корневой элемент не должен перетаскиваться непосредственно на другой корневой элемент.
Я пробовал реализовать собственные методы dropEvent в своем подклассе QTreeView, но столкнулся с проблемами, из-за которых корневые элементы не могут быть переброшены. можно свободно перемещать по другим корневым элементам.
Вот упрощенная версия моей текущей реализации:
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

Вернуться в «Python»