How to Drag and Drop from One QListWidget to Another

前端 未结 3 1806
心在旅途
心在旅途 2020-12-05 16:25

There are two QListWIdgets sitting in a same dialog window. The DragDrop functionality has been enabled for both. If I drag and drop a file to any of two ListWidges the prog

相关标签:
3条回答
  • 2020-12-05 16:50

    The above code did not work for me, when implementing the Python 3 style of super().

    The issue is that the inherited methods dragMoveEvent and dragDropEvent were not being overwritten with the new definitions in the child class.

    Therefore event.setDropAction(QtCore.Qt.MoveAction) was not being called, and the widget behavior defaulted to QtCore.Qt.CopyAction.

    I solved this using the setDefaultDropAction() method inherited from the QAbstractItemView class.

    Here is the implementation in PyQt5 and Python 3.7:

    class NewDragDropWidget(QListWidget):
    
        def __init__(self):
            super().__init__()
            self.setIconSize(QtCore.QSize(124, 124))
            self.setDragDropMode(QAbstractItemView.DragDrop)
            self.setDefaultDropAction(QtCore.Qt.MoveAction) # this was the magic line
            self.setSelectionMode(QAbstractItemView.ExtendedSelection)
            self.setAcceptDrops(True)
    
    0 讨论(0)
  • 2020-12-05 16:53

    Assuming you want to move the list-widget items, your subclass should be as below (note that setDragDropMode and setSelectionMode have been moved into __init__):

    class ThumbListWidget(QtGui.QListWidget):
        def __init__(self, type, parent=None):
            super(ThumbListWidget, self).__init__(parent)
            self.setIconSize(QtCore.QSize(124, 124))
            self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
            self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
            self.setAcceptDrops(True)
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls():
                event.accept()
            else:
                super(ThumbListWidget, self).dragEnterEvent(event)
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls():
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
            else:
                super(ThumbListWidget, self).dragMoveEvent(event)
    
        def dropEvent(self, event):
            if event.mimeData().hasUrls():
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
                links = []
                for url in event.mimeData().urls():
                    links.append(str(url.toLocalFile()))
                self.emit(QtCore.SIGNAL("dropped"), links)
            else:
                event.setDropAction(QtCore.Qt.MoveAction)
                super(ThumbListWidget, self).dropEvent(event)
    
    0 讨论(0)
  • 2020-12-05 17:12

    Here is a revised code. It is working like a charm! Bravo!

    from PyQt4 import QtGui, QtCore
    import sys, os
    
    class ThumbListWidget(QtGui.QListWidget):
        def __init__(self, type, parent=None):
            super(ThumbListWidget, self).__init__(parent)
            self.setIconSize(QtCore.QSize(124, 124))
            self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
            self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
            self.setAcceptDrops(True)
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls():
                event.accept()
            else:
                super(ThumbListWidget, self).dragEnterEvent(event)
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls():
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
            else:
                super(ThumbListWidget, self).dragMoveEvent(event)
    
        def dropEvent(self, event):
            print 'dropEvent', event
            if event.mimeData().hasUrls():
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
                links = []
                for url in event.mimeData().urls():
                    links.append(str(url.toLocalFile()))
                self.emit(QtCore.SIGNAL("dropped"), links)
            else:
                event.setDropAction(QtCore.Qt.MoveAction)
                super(ThumbListWidget, self).dropEvent(event)
    
    
    class Dialog_01(QtGui.QMainWindow):
        def __init__(self):
            super(QtGui.QMainWindow,self).__init__()
            self.listItems={}
    
            myQWidget = QtGui.QWidget()
            myBoxLayout = QtGui.QVBoxLayout()
            myQWidget.setLayout(myBoxLayout)
            self.setCentralWidget(myQWidget)
    
            self.listWidgetA = ThumbListWidget(self)
            for i in range(12): 
                QtGui.QListWidgetItem( 'Item '+str(i), self.listWidgetA )
            myBoxLayout.addWidget(self.listWidgetA)
    
            self.listWidgetB = ThumbListWidget(self)
            myBoxLayout.addWidget(self.listWidgetB)   
    
            self.connect(self.listWidgetA, QtCore.SIGNAL("dropped"), self.items_dropped)
            self.listWidgetA.currentItemChanged.connect(self.item_clicked)
    
            self.connect(self.listWidgetB, QtCore.SIGNAL("dropped"), self.items_dropped)
            self.listWidgetB.currentItemChanged.connect(self.item_clicked)
    
        def items_dropped(self, arg):
            print 'items_dropped', arg
    
        def item_clicked(self, arg):
            print arg
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        dialog_1 = Dialog_01()
        dialog_1.show()
        dialog_1.resize(480,320)
        sys.exit(app.exec_())
    
    0 讨论(0)
提交回复
热议问题