【问题标题】:Drag and Drop between two QListWidgets PyQt5在两个 QListWidgets PyQt5 之间拖放
【发布时间】:2015-07-08 23:11:58
【问题描述】:

我有两个 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 移动列表项。

【问题讨论】:

    标签: drag-and-drop pyqt5


    【解决方案1】:

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

    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 类导入到您需要的任何地方,它就像一个魅力一样工作,但并没有真正教给您太多东西。希望这可以帮助某些人度过难关,直到有人正确回答问题为止。

    【讨论】:

    • 如果我使用QWidgets 而不是QListWidgets,这种事情会起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2013-03-02
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多