Как отключить вставку QTreeWidget при перетаскивании, с помощью пользовательского кодирования dropEvent? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть следующий код, и я хочу отключить перетаскивание между QTreeWidgetItem, существующим в дереве. Я не могу понять, как? Есть мысли?

def dropEvent(self, event):
    target_item = self.itemAt(event.pos())
    if not target_item:
        return

    selected_items = self.selectedItems()
    item = None
    if selected_items:
        for item in selected_items:
            item_data = item.data(0, QtCore.Qt.UserRole)
            target_item_data = target_item.data(0, QtCore.Qt.UserRole)

            if components_api.is_plug(item.text(0)):
                if components_api.is_plug(target_item.text(0)):
                    return
            else:
                if not components_api.is_plug(item.text(0)):
                    if not components_api.is_part_root(item.text(0)):
                        return
                if not components_api.is_plug(target_item.text(0)):
                    return
            item.setExpanded(True)
    super(TreeWidget, self).dropEvent(event)

1 Ответ

0 голосов
/ 25 октября 2019

В простых случаях, если не было сделано никакой специальной реализации, этого должно быть достаточно:

class TreeWidget(QtWidgets.QTreeWidget):
    def __init__(self, parent=None):
        super(TreeWidget, self).__init__(parent)
        # ...
        self.setDragDropOverwriteMode(True)
        self.setDragDropMode(self.InternalMove)

В противном случае вы можете просто проигнорировать событие, если индикатор отбрасывания отсутствует на элементе, после обработка события dragMove с использованием реализации базового класса. Поскольку индикатор сброса должен отображаться для обеспечения успешной операции перетаскивания, и вы, вероятно, не хотите, чтобы он отображался, если операцию следует игнорировать, вы можете включить его перед вызовом базовой реализации, а затем отключить его соответствующим образом:

    def dragMoveEvent(self, event):
        self.setDropIndicatorShown(True)
        super(TreeWidget, self).dragMoveEvent(event)
        if self.dropIndicatorPosition() != self.OnItem:
            self.setDropIndicatorShown(False)
            event.ignore()
...