如何拖放具有附加属性的QListWidgetItem子类的实例?

问题描述 投票:0回答:1

我正在使用PyQt5,但还很新。我想将一个QListWidgetItem从一个QListWidget拖放到另一个QListWidgetItem,以便在一侧生成的QListWidgetItem将包含其他数据。我尝试对QListWidgetItem进行子类化,但由于似乎创建了QListWidgetItem的新实例,因此该类型不会进行拖放操作。]

这里是代码:

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QListWidget, QListWidgetItem, QAction, QVBoxLayout
from PyQt5 import QtCore, QtGui
import sys


class GUI(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.central_widget = MyCentralWidget(self)
        self.setCentralWidget(self.central_widget)


class MyCustomItem(QListWidgetItem):
    def __init__(self, data, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.extra_data = data


class MyCentralWidget(QWidget):
    def __init__(self, parent):
        super(MyCentralWidget, self).__init__(parent)
        self.h_layout = QHBoxLayout(self)
        self.setLayout(self.h_layout)

        self.list_left = DragAndDropList()
        self.list_left.setDragEnabled(True)
        self.list_left.setAcceptDrops(False)

        self.list_right = DragAndDropList()

        self.h_layout.addWidget(self.list_left)
        self.h_layout.addWidget(self.list_right)

        item = MyCustomItem(69, 'custom_item')
        self.list_left.insertItem(1, item)


class DragAndDropList(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setIconSize(QtCore.QSize(124, 124))
        self.setDragDropMode(self.DragDrop)
        self.setSelectionMode(self.ExtendedSelection)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            super().dragEnterEvent(event)

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            super().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.LinkAction)
            super().dropEvent(event)

            list_items = [self.item(i) for i in range(self.count())]
            for l in list_items:
                print(l.extra_data)


def main():
    app = QApplication([])
    win = GUI()
    win.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

当我尝试拖放custom_item时,出现错误:“ AttributeError:'QListWidgetItem'对象没有属性'extra_data'。”>

我确实看过这个线程[1],但是它已经过时了,没有明确的解决方案。

我正在使用PyQt5,但还很新。我想将一个QListWidgetItem从一个QListWidget拖放到另一个QListWidgetItem,以便在一侧上生成的QListWidgetItem将包含其他...

python python-3.x user-interface pyqt pyqt5
1个回答
0
投票

子类化QListWidgetItem将无济于事,因为拖放数据始终是序列化的,这意味着永远不会交换实例引用。

[如果您的数据是可序列化的(显然是字符串,但是通常任何QVariant类型都可以,例如QColor或QPixmap),则可以只将QListWidgetItem.setData()与要存储的每个数据字段一起使用的自定义角色,然后用QListWidgetItem.setData()取回该数据。

© www.soinside.com 2019 - 2024. All rights reserved.