【发布时间】:2021-09-15 20:09:17
【问题描述】:
我正在尝试制作一个QTreeWidget,让用户重新排列其元素,如果用户将树项目拖放到另一个小部件,我不希望删除该项目。为了获得这种行为,我尝试在dropEvent 中使用setDropAction。
下面的代码成功拒绝其他小部件的拖放,并允许在不删除原始小部件的情况下拖放到其他小部件,但它似乎破坏了树内的拖放 - 它导致项目在拖放时消失。
https://www.screencast.com/t/driIjyg8ekzt
import sys
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtCore import Qt
class MyTree(QtWidgets.QTreeWidget):
def __init__(self):
super().__init__()
self.setDragDropMode(self.DragDrop)
self.setSelectionMode(self.ExtendedSelection)
self.setSelectionBehavior(self.SelectRows)
self.setDefaultDropAction(Qt.CopyAction)
self.setAcceptDrops(True)
def dropEvent(self, e: QtGui.QDropEvent):
if e.source() is self:
print("move")
e.setDropAction(Qt.MoveAction)
e.accept()
super().dropEvent(e)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
my_list = QtWidgets.QListWidget()
my_list.addItems(list('1234'))
my_list.show()
my_list.setDragEnabled(True)
my_list.setAcceptDrops(True)
my_tree = MyTree()
for item in list('abcd'):
QtWidgets.QTreeWidgetItem(my_tree, [item])
my_tree.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python pyqt pyqt5 qtreewidget