我正在使用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将包含其他...
子类化QListWidgetItem将无济于事,因为拖放数据始终是序列化的,这意味着永远不会交换实例引用。
[如果您的数据是可序列化的(显然是字符串,但是通常任何QVariant类型都可以,例如QColor或QPixmap),则可以只将QListWidgetItem.setData()
与要存储的每个数据字段一起使用的自定义角色,然后用QListWidgetItem.setData()
取回该数据。