如何使用编码自定义dropEvent在拖放时禁用QTreeWidget插入?

时间:2019-10-25 00:50:30

标签: python pyqt qtreewidget

我有以下代码,我想在树中现有的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 :(得分:0)

在简单的情况下,如果没有进行特殊的实现,就足够了:

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()