如何使用编码自定义 dropEvent 在拖放时禁用 QTreeWidget 插入?
How to disable QTreeWidget insertion on drag and drop, with coding custom dropEvent?
我有以下代码,我想禁用在树中存在的 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)
在简单的情况下,如果没有做特殊的实现,这样就可以了:
class TreeWidget(QtWidgets.QTreeWidget):
def __init__(self, parent=None):
super(TreeWidget, self).__init__(parent)
# ...
self.setDragDropOverwriteMode(True)
self.setDragDropMode(self.InternalMove)
否则,如果放置指示器不在项目上,您可以忽略该事件,在 使用基础 class 实现处理 dragMove 事件之后。由于应显示放置指示器以确保 drag/drop 操作成功,并且如果应忽略该操作,您可能不希望它可见,因此您可以在调用基本实现之前启用它,然后相应地禁用它:
def dragMoveEvent(self, event):
self.setDropIndicatorShown(True)
super(TreeWidget, self).dragMoveEvent(event)
if self.dropIndicatorPosition() != self.OnItem:
self.setDropIndicatorShown(False)
event.ignore()
我有以下代码,我想禁用在树中存在的 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)
在简单的情况下,如果没有做特殊的实现,这样就可以了:
class TreeWidget(QtWidgets.QTreeWidget):
def __init__(self, parent=None):
super(TreeWidget, self).__init__(parent)
# ...
self.setDragDropOverwriteMode(True)
self.setDragDropMode(self.InternalMove)
否则,如果放置指示器不在项目上,您可以忽略该事件,在 使用基础 class 实现处理 dragMove 事件之后。由于应显示放置指示器以确保 drag/drop 操作成功,并且如果应忽略该操作,您可能不希望它可见,因此您可以在调用基本实现之前启用它,然后相应地禁用它:
def dragMoveEvent(self, event):
self.setDropIndicatorShown(True)
super(TreeWidget, self).dragMoveEvent(event)
if self.dropIndicatorPosition() != self.OnItem:
self.setDropIndicatorShown(False)
event.ignore()