在两个QListWidgets之间拖放PyQt5

时间:2015-07-08 23:11:59

标签: drag-and-drop pyqt5

我有两个QListWidgets。我希望能够通过拖放将小部件1中的项目移动到小部件2上,反之亦然。它必须适用于MultiSelection模式。它必须是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 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的所有相关文档,而我似乎无法做到这一点。我很少最终无法解决问题但是这方面的文档似乎相当糟糕。我真的在寻找解释和代码。但是,正如我所说,我已多次阅读所有相关文档,所以我并非完全无知。在上面的课程中对我来说,我有更多,然后我需要的东西,它可能有正确的组件,而不是正确的实现。谢谢你们,请给我一些关于这个主题的清晰度。

要在答案代码中澄清的主要内容

  1. 最低/最有效的DragDrop(内置方法,即dragEnterEvent,dragMoveEvent等等)方法。
  2. 绝对需要mimeData()吗?从文档中假设是。
  3. 将mimeData()格式化为QListWidgetItem。
  4. 是否必须手动从小部件中删除该项目,或者是这样 内置QtCore.Qt.MoveAction?
  5. 实际上让QtCore.Qt.MoveAction移动列表项。

1 个答案:

答案 0 :(得分:0)

所以我找到了一个解决方案,让一切工作正常。请记住,这个答案并没有教会我想知道什么。但是,这可能对希望做同样或类似事情的其他人有所帮助。我仍然在寻找一种方法来触及“澄清代码的主要内容”列表中列出的主题。

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类并将其导入到您需要的任何位置它就像魅力一样,但并不能真正教会您。希望这有助于某些人顺利通过,直到有人正确回答问题为止。