# -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem, QLabel from PyQt5.QtCore import Qt, QMimeData from PyQt5.QtGui import QDrag class DragLabel(QLabel): def __init__(self, text): super().__init__(text) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: drag = QDrag(self) mime_data = QMimeData() mime_data.setText(self.text()) drag.setMimeData(mime_data) drag.exec_(Qt.MoveAction) class ListWidget(QListWidget): def __init__(self): super().__init__() self.setAcceptDrops(True) self.setDragEnabled(True) self.setDragDropMode(QListWidget.InternalMove) for i in range(10): item = QListWidgetItem(self) label = DragLabel(f'Label {i}') item.setSizeHint(label.sizeHint()) self.setItemWidget(item, label) def dragEnterEvent(self, event): if event.mimeData().hasText(): event.accept() else: event.ignore() def dropEvent(self, event): text = event.mimeData().text() item = QListWidgetItem(self) label = DragLabel(text) item.setSizeHint(label.sizeHint()) self.setItemWidget(item, label) class MainWindow(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): list_widget1 = ListWidget() list_widget2 = ListWidget() self.setGeometry(300, 300, 500, 200) self.setWindowTitle('Drag and Drop Example') layout = QHBoxLayout() layout.addWidget(list_widget1) layout.addWidget(list_widget2) self.setLayout(layout) self.show() if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() sys.exit(app.exec_())