在两个 QListWidgets PyQt5 之间拖放
Drag and Drop between two QListWidgets PyQt5
我有两个 QListWidgets。我希望能够通过拖放将项目从小部件 1 移动到小部件 2,反之亦然。它必须与多选模式一起使用。它必须是 MoveAction 而不是复制操作。实现此目的的一种简单方法是使用:
self.listWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.listWidget_2.setDefaultDropAction(QtCore.Qt.MoveAction)
self.listWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.listWidget_2.setObjectName("listWidget_2")
self.listWidget_2.acceptDrops()
这实现了所有期望的要求,但需要注意一点。将项目拖放到它当前所在的小部件上会将其从小部件中删除。绝对不行。然后我尝试编写自己的 QListWidget class 来实现我想要的结果无济于事,这是 class:
class dragLeaveList(QtWidgets.QListWidget):
def __init__(self, type, parent=None):
super(dragLeaveList, self).__init__(parent)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.setAlternatingRowColors(True)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.accept()
print("Drag Enter Event: IF CLAUSE")
else:
super(dragLeaveList, self).dragEnterEvent(event)
print("Drag Enter Event: ELSE CLAUSE")
def dragMoveEvent(self, event):
if event.mimeData().hasText():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
else:
event.ignore()
super(dragLeaveList, self).dragMoveEvent(event)
def dropEvent(self, event):
print("Drop Event ", event)
if event.mimeData().hasText():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
print("Drop Event - 1 ", event)
def startDrag(self, event):
print("In Start Drag")
item = self.currentItem()
itemText = self.currentItem().text()
itemData = QtCore.QByteArray()
dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
print(item, itemText)
mimeData = QtCore.QMimeData()
mimeData.setData(itemText, itemData)
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
if drag.exec_(QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
if self.currentItem() is not None:
self.takeItem(self.row(item))
我已经阅读了所有在线教程和 sourceforge 上的所有相关文档,但我似乎无法完成这项工作。我很少最终无法弄清楚一些事情,但是这方面的文档似乎非常糟糕。我真的在寻找解释和代码。但是,正如我所说,我已经多次阅读所有相关文档,所以我并非完全无知。在我看来,在上面 class 中,我拥有的比我需要的要多得多,它可能有正确的组件,但没有正确的实现。请给我一些关于这个主题的说明,非常感谢。
答案代码中需要说明的主要内容
- 基本 minimum/most 有效的 DragDrop(内置方法,即 dragEnterEvent、dragMoveEvent 等)方法。
- mimeData() 是绝对必需的吗?假设文档中的是。
- 将 mimeData() 格式化为 QListWidgetItem。
- 是否必须从小部件中手动删除该项目,或者这是
内置 QtCore.Qt.MoveAction?
- 实际上正在 QtCore.Qt.MoveAction 移动列表项。
所以我想出了一个解决方案来让一切正常工作。请记住,这个答案并没有告诉我我想知道的东西。但是,这可能对希望做相同或类似事情的其他人有所帮助。我仍在寻找一种方法来触及“澄清代码的主要内容”列表中列出的主题。
class QListDragAndDrop(QtWidgets.QListWidget):
def __init__(self):
super(QListDragAndDrop, self).__init__()
self.setFrameShape(QtWidgets.QFrame.WinPanel)
self.setFrameShadow(QtWidgets.QFrame.Raised)
self.setDragEnabled(True)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.setMovement(QtWidgets.QListView.Snap)
self.setProperty("isWrapping", True)
self.setWordWrap(True)
self.setSortingEnabled(True)
self.setAcceptDrops(True)
只需制作这个 QListWidget class 并设置这些参数并导入到您需要的任何地方,它就像一个魅力,但并没有真正教给您太多。希望这可以帮助某些人度过难关,直到有人正确回答问题。
我有两个 QListWidgets。我希望能够通过拖放将项目从小部件 1 移动到小部件 2,反之亦然。它必须与多选模式一起使用。它必须是 MoveAction 而不是复制操作。实现此目的的一种简单方法是使用:
self.listWidget_2.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.listWidget_2.setDefaultDropAction(QtCore.Qt.MoveAction)
self.listWidget_2.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.listWidget_2.setObjectName("listWidget_2")
self.listWidget_2.acceptDrops()
这实现了所有期望的要求,但需要注意一点。将项目拖放到它当前所在的小部件上会将其从小部件中删除。绝对不行。然后我尝试编写自己的 QListWidget class 来实现我想要的结果无济于事,这是 class:
class dragLeaveList(QtWidgets.QListWidget):
def __init__(self, type, parent=None):
super(dragLeaveList, self).__init__(parent)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.setAlternatingRowColors(True)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.accept()
print("Drag Enter Event: IF CLAUSE")
else:
super(dragLeaveList, self).dragEnterEvent(event)
print("Drag Enter Event: ELSE CLAUSE")
def dragMoveEvent(self, event):
if event.mimeData().hasText():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
else:
event.ignore()
super(dragLeaveList, self).dragMoveEvent(event)
def dropEvent(self, event):
print("Drop Event ", event)
if event.mimeData().hasText():
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
print("Drop Event - 1 ", event)
def startDrag(self, event):
print("In Start Drag")
item = self.currentItem()
itemText = self.currentItem().text()
itemData = QtCore.QByteArray()
dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
print(item, itemText)
mimeData = QtCore.QMimeData()
mimeData.setData(itemText, itemData)
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
if drag.exec_(QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
if self.currentItem() is not None:
self.takeItem(self.row(item))
我已经阅读了所有在线教程和 sourceforge 上的所有相关文档,但我似乎无法完成这项工作。我很少最终无法弄清楚一些事情,但是这方面的文档似乎非常糟糕。我真的在寻找解释和代码。但是,正如我所说,我已经多次阅读所有相关文档,所以我并非完全无知。在我看来,在上面 class 中,我拥有的比我需要的要多得多,它可能有正确的组件,但没有正确的实现。请给我一些关于这个主题的说明,非常感谢。
答案代码中需要说明的主要内容
- 基本 minimum/most 有效的 DragDrop(内置方法,即 dragEnterEvent、dragMoveEvent 等)方法。
- mimeData() 是绝对必需的吗?假设文档中的是。
- 将 mimeData() 格式化为 QListWidgetItem。
- 是否必须从小部件中手动删除该项目,或者这是 内置 QtCore.Qt.MoveAction?
- 实际上正在 QtCore.Qt.MoveAction 移动列表项。
所以我想出了一个解决方案来让一切正常工作。请记住,这个答案并没有告诉我我想知道的东西。但是,这可能对希望做相同或类似事情的其他人有所帮助。我仍在寻找一种方法来触及“澄清代码的主要内容”列表中列出的主题。
class QListDragAndDrop(QtWidgets.QListWidget):
def __init__(self):
super(QListDragAndDrop, self).__init__()
self.setFrameShape(QtWidgets.QFrame.WinPanel)
self.setFrameShadow(QtWidgets.QFrame.Raised)
self.setDragEnabled(True)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
self.setMovement(QtWidgets.QListView.Snap)
self.setProperty("isWrapping", True)
self.setWordWrap(True)
self.setSortingEnabled(True)
self.setAcceptDrops(True)
只需制作这个 QListWidget class 并设置这些参数并导入到您需要的任何地方,它就像一个魅力,但并没有真正教给您太多。希望这可以帮助某些人度过难关,直到有人正确回答问题。