【发布时间】:2020-04-07 00:09:41
【问题描述】:
我正在使用 PyQt5 并且对它很陌生。我想将 QListWidgetItem 从一个 QListWidget 拖放到另一个,这样在一侧生成的 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' object has no attribute 'extra_data'”。
我确实看过这个帖子 [1],但它已经过时并且没有明确的解决方案。
【问题讨论】:
标签: python python-3.x user-interface pyqt pyqt5