PySide: Drag and drop files into QListWidget

后端 未结 3 1279
时光说笑
时光说笑 2021-01-06 15:22

This is my first entry here so apologies for any newbie mistakes. I\'ve searched both here and Google with no luck before posting.

I want to be able to add images to

相关标签:
3条回答
  • 2021-01-06 15:43

    Found out how PySide signals work in the end. Here's the PyQt4 code above, ported to PySide. I'd love to hear if there are better solutions out there.

    import sys
    import os
    from PySide import QtGui, QtCore
    
    class TestListView(QtGui.QListWidget):
    
        fileDropped = QtCore.Signal(list)
    
        def __init__(self, type, parent=None):
            super(TestListView, self).__init__(parent)
            self.setAcceptDrops(True)
            self.setIconSize(QtCore.QSize(72, 72))
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls:
                event.accept()
            else:
                event.ignore()
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
            else:
                event.ignore()
    
        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.fileDropped.emit(links)
            else:
                event.ignore()
    
    class MainForm(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(MainForm, self).__init__(parent)
    
            self.view = TestListView(self)
            self.view.fileDropped.connect(self.pictureDropped)
            self.setCentralWidget(self.view)
    
        def pictureDropped(self, l):
            for url in l:
                if os.path.exists(url):
                    print(url)                
                    icon = QtGui.QIcon(url)
                    pixmap = icon.pixmap(72, 72)                
                    icon = QtGui.QIcon(pixmap)
                    item = QtGui.QListWidgetItem(url, self.view)
                    item.setIcon(icon)        
                    item.setStatusTip(url)        
    
    def main():
        app = QtGui.QApplication(sys.argv)
        form = MainForm()
        form.show()
        app.exec_()
    
    if __name__ == '__main__':
        main()
    
    0 讨论(0)
  • 2021-01-06 16:00

    For me this worked fine (tested on PySide2 & PyQt5). This is not a drop signal, but a signal when the rows of a QListWidget have been moved. In my case this is always happening after dropping.

    self.window.my_list_widget.model().rowsMoved.connect(self.my_method)
    
    0 讨论(0)
  • 2021-01-06 16:04

    I made some changes of @thimic 's code, so that it can run in my computer:

    import sys
    import os
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    class TestListView(QListWidget):
    
    
        def __init__(self, type, parent=None):
            super(TestListView, self).__init__(parent)
            self.setAcceptDrops(True)
            self.setIconSize(QtCore.QSize(72, 72))
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls:
                event.accept()
            else:
                event.ignore()
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
            else:
                event.ignore()
    
        def dropEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
                links = []
                for url in event.mimeData().urls():
                    links.append(str(url.toLocalFile()))
                print('Has drop Event! ')
            else:
                event.ignore()
    
    class MainForm(QMainWindow):
        def __init__(self, parent=None):
            super(MainForm, self).__init__(parent)
    
            self.view = TestListView(self)
            self.view.fileDropped.connect(self.pictureDropped)
            self.setCentralWidget(self.view)
    
        def pictureDropped(self, l):
            for url in l:
                if os.path.exists(url):
                    print(url)
                    icon = QtGui.QIcon(url)
                    pixmap = icon.pixmap(72, 72)
                    icon = QtGui.QIcon(pixmap)
                    item = QtGui.QListWidgetItem(url, self.view)
                    item.setIcon(icon)
                    item.setStatusTip(url)
    
    def main():
        app = QApplication(sys.argv)
        form = MainForm()
        form.show()
        app.exec_()
    
    if __name__ == '__main__':
        main()
    
    0 讨论(0)
提交回复
热议问题