71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
|
# -*- 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_())
|