我有以下代码,我想在树中现有的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)
答案 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()