PyQt5 drag and drop widget при переносе виджета в QlistWidget копируется пустой объект
Пытаюсь скопировать динамически созданный widget с помощью drag & drop и не получаю нужный результат, возможно чего-то не учел в функции def dropEvent(self, e)
, но не могу понять что.
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QHBoxLayout,QListWidgetItem,QPushButton,QAbstractItemView
from PyQt5.QtGui import QIcon,QDragEnterEvent,QDropEvent
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class TaskList(QListWidget):
def __init__(self):
super(TaskList, self).__init__()
self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setWordWrap(True)
self.setSortingEnabled(True)
def dragEnterEvent(self, e):
e.accept()
def dragMoveEvent(self, e):
e.accept()
def dropEvent(self, e):
print("========DropEvent--")
widget = e.source()
e.acceptProposedAction()
items=widget.selectedItems()
for i in items:
widget.takeItem(widget.indexFromItem(i).row())
dd = widget.takeItem(widget.indexFromItem(i).row())
self.addItem(i)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setAcceptDrops(True)
self.myListWidget1 = TaskList()
self.myListWidget2 = TaskList()
self.myListWidget3 = TaskList()
self.setGeometry(300, 350, 500, 300)
self.myLayout = QHBoxLayout()
self.myLayout.addWidget(self.myListWidget1)
self.myLayout.addWidget(self.myListWidget2)
self.myLayout.addWidget(self.myListWidget3)
itemN = QListWidgetItem()
widget = QtWidgets.QWidget()
widgetText = QtWidgets.QLabel("I love PyQt!")
widgetText.setAcceptDrops(True)
widgetButton = QtWidgets.QPushButton("Push Me")
widgetButton.setAcceptDrops(True)
widgetLayout = QtWidgets.QVBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()
widgetLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
widget.setLayout(widgetLayout)
itemN.setSizeHint(widget.sizeHint())
self.myListWidget1.addItem(itemN)
self.myListWidget1.setItemWidget(itemN, widget)
self.setWindowTitle('Drag and Drop Example');
self.setLayout(self.myLayout)
self.show()
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
Источник: Stack Overflow на русском