PyQt中如何实现QListWidget项拖拽到QLabel并设置对应文本
PyQt QListWidget条目拖拽到QLabel的实现方案
问题原因
默认QListWidget拖拽条目时,不会在mimeData中填充文本字段,而是使用Qt内置的自定义MIME类型application/x-qabstractitemmodeldatalist存储条目相关数据,所以你现有代码中调用event.mimeData().hasText()会返回False,逻辑无法触发。你不需要自定义QListWidgetItem,两种低成本实现方案如下:
方案1:自定义QListWidget重写拖拽逻辑(推荐)
该方案主动在拖拽的mimeData中插入条目文本,你原有的自定义Label代码不需要做任何修改,且后续拖拽到其他支持接收文本的控件也能正常识别。
from PyQt5.QtWidgets import QListWidget from PyQt5.QtCore import Qt, QMimeData, QDrag class CustomListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) # 开启拖拽功能 self.setDragEnabled(True) def startDrag(self, supported_actions): current_item = self.currentItem() if not current_item: return super().startDrag(supported_actions) # 构造mime数据主动写入选中条目的文本 mime_data = QMimeData() mime_data.setText(current_item.text()) # 执行拖拽 drag = QDrag(self) drag.setMimeData(mime_data) drag.exec_(supported_actions)
使用该自定义类替换你原有代码中的QListWidget即可。
方案2:修改自定义Label的拖拽解析逻辑
如果不想修改原有QListWidget的代码,可以直接调整Label的事件处理逻辑,解析Qt内置的拖拽数据格式提取条目文本:
from PyQt5.QtWidgets import QLabel from PyQt5.QtCore import QByteArray, QDataStream, QIODevice, Qt class Label(QLabel): def __init__(self, parent=None): super().__init__(parent) self.setAcceptDrops(True) def dragEnterEvent(self, event): # 同时支持纯文本和QListWidget默认拖拽格式 if event.mimeData().hasText() or event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'): event.accept() else: event.ignore() def dropEvent(self, event): mime_data = event.mimeData() if mime_data.hasText(): self.setText(mime_data.text()) event.accept() return # 解析QListWidget默认拖拽数据 if mime_data.hasFormat('application/x-qabstractitemmodeldatalist'): byte_data: QByteArray = mime_data.data('application/x-qabstractitemmodeldatalist') stream = QDataStream(byte_data, QIODevice.ReadOnly) while not stream.atEnd(): # 跳过行、列标识位 stream.readInt32() stream.readInt32() # 读取条目数据,取DisplayRole对应显示文本 data_map = stream.readQVariantMap() if Qt.DisplayRole in data_map: self.setText(data_map[Qt.DisplayRole]) break event.accept()
内容的提问来源于stack exchange,提问作者P.B.
相关产品推荐
相关产品推荐

