Python QTreeWidget中的拖放操作未复制已删除的项

Python QTreeWidget中的拖放操作未复制已删除的项,python,pyqt,drag-and-drop,pyqt5,qtreewidget,Python,Pyqt,Drag And Drop,Pyqt5,Qtreewidget,我想通过拖放鼠标操作从QTreeWidget-父项下的另一个父项下复制一个项目。 为此,我实现了dropEvent(),并将dropAction设置为Qt.CopyAction。 但无论如何,我正在删除的项不会复制到新父项下。 例如->在组“LON”下拖动用户“schmidt” 预期行为:我正在删除的项正在新父项下复制。(例如,用户“schmidt”将添加到组“LON”下) 完整工作代码示例: #!/usr/bin/env python3 # coding = utf-8 import sys

我想通过拖放鼠标操作
QTreeWidget
-父项下的另一个父项下复制一个项目。 为此,我实现了
dropEvent()
,并将
dropAction
设置为
Qt.CopyAction
。 但无论如何,我正在删除的项不会复制到新父项下。 例如->在组“LON”下拖动用户“schmidt”

预期行为:我正在删除的项正在新父项下复制。(例如,用户“schmidt”将添加到组“LON”下)

完整工作代码示例:

#!/usr/bin/env python3
# coding = utf-8
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MyTreeWidget(QtWidgets.QTreeWidget):
    def __init__(self):
        QtWidgets.QTreeView.__init__(self)        
        self.setSelectionMode(self.SingleSelection)
        self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
        self.setDragEnabled(True)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)

    def dropEvent(self, event):        
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()       

class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.tree = MyTreeWidget()
        self.tree.setRootIsDecorated(True)
        self.tree.setHeaderHidden(True)

        self.setCentralWidget(self.tree)

        itemUsers = QtWidgets.QTreeWidgetItem(self.tree, ["User"])
        itemUsers.addChild(QtWidgets.QTreeWidgetItem(itemUsers, ["schmidt"]))
        itemUsers.addChild(QtWidgets.QTreeWidgetItem(itemUsers, ["weber"]))

        itemMdt = QtWidgets.QTreeWidgetItem(self.tree, ["Group"])
        itemMdt.addChild(QtWidgets.QTreeWidgetItem(itemMdt, ["FFM"]))
        itemMdt.addChild(QtWidgets.QTreeWidgetItem(itemMdt, ["LON"]))
        itemMdt.addChild(QtWidgets.QTreeWidgetItem(itemMdt, ["NY"]))

        self.show()
        self.setGeometry(400, 400, 400, 400)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = MyMainWindow()    
    sys.exit(app.exec_())

删除dropEvent方法

TL;博士


无需重写dropEvent方法,因为它已经实现了复制项的所有逻辑。

删除dropEvent方法

TL;博士


无需重写dropEvent方法,因为它已经实现了复制项目的所有逻辑。

谢谢。我该如何实现一个验证,证明该项已经存在于新的父项下,如果是这种情况,则跳过它?@ProfP30您可以覆盖dropEvent方法并调用super(),如果它有效:
def dropEvent(self,event):if validation\u函数(event):super()。dropEvent(event)
谢谢!我如何评估丢失的数据(例如,删除的QTreeWidgetItem的文本。源参数仅包含QTreeWidgets名称。我如何迭代所有新的父级现有子级以与前者进行比较。我想检查删除的项是否已作为新父级的子级存在。@ProfP30然后获取事件的mimedata信息,例如创建一个伪_模型(作为此解决方案中的一个实现:)并获取该项。谢谢。通过
super()插入此新插入的项后,如何设置其图标。dropEvent(事件)
?谢谢。我该如何验证该项在新父项下已经存在,如果是这种情况,则跳过它?@ProfP30您可以重写dropEvent方法并调用super(),如果它有效:
def dropEvent(self,event):if validation_函数(event):super()。dropEvent(event)
谢谢!我如何评估丢弃的数据(例如,删除的QTreeWidgetItem的文本。源参数仅包含QTreeWidgets名称。我如何迭代所有新的父级现有子级以与前者进行比较。我想检查删除的项是否已作为新父级的子级存在。@ProfP30然后获取事件的mimedata信息,例如创建一个伪_模型(作为此解决方案中的一个实现:)并获取该项目。谢谢。在通过
super()插入新插入的项目后,如何设置该项目的图标。dropEvent(event)