如何为Qt ListWidget元素添加对应图标及拖拽后显示图标?

问题描述
如截图所示,希望为ListWidget中的项添加对应颜色的图标(例如为blue.png添加蓝色图标),同时实现将元素从「可用纹理」拖拽到「选中纹理」后,目标Widget也显示对应图标。
当前尝试的代码片段:
if __name__ == "__main__": ui_obj = TextureSwatcherUI() files = [] for i in os.listdir("Q:/...../tex_source/"): files.append(i) list_item = QListWidgetItem(i, ui_obj.available_textures) list_item.setIcon("Q:/...../tex_source/red.png")
解决方案
1. 为每个列表项匹配对应图标
你当前代码固定使用red.png作为所有项的图标,要实现每个文件对应自身图标,需要注意两个关键点:
- 用当前遍历的文件名拼接完整文件路径
setIcon方法需要接收QIcon对象,而非直接传字符串路径
修改后的代码:
from PyQt5.QtGui import QIcon import os if __name__ == "__main__": ui_obj = TextureSwatcherUI() tex_dir = "Q:/...../tex_source/" # 遍历目录下的文件 for filename in os.listdir(tex_dir): # 拼接完整文件路径 full_path = os.path.join(tex_dir, filename) # 创建列表项并设置对应图标 list_item = QListWidgetItem(filename, ui_obj.available_textures) list_item.setIcon(QIcon(full_path))
2. 实现拖拽后目标Widget显示对应图标
需要为两个ListWidget配置拖拽属性,并处理拖拽事件:
步骤1:自定义支持接收拖拽的ListWidget
继承QListWidget实现拖拽逻辑:
from PyQt5.QtWidgets import QListWidget, QListWidgetItem from PyQt5.QtCore import Qt, QMimeData class DropableListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) self.setAcceptDrops(True) self.setDropIndicatorShown(True) def dragEnterEvent(self, event): # 仅接收QListWidgetItem的拖拽数据 if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'): event.acceptProposedAction() def dropEvent(self, event): # 获取拖拽的源列表项 source_item = event.source().currentItem() if not source_item: return # 创建新项,复制源项的文本和图标 new_item = QListWidgetItem(source_item.text()) new_item.setIcon(source_item.icon()) self.addItem(new_item) # 可选:拖拽后从源列表移除原项 # event.source().takeItem(event.source().row(source_item)) event.acceptProposedAction()
步骤2:配置列表组件
在你的TextureSwatcherUI类中,初始化时设置两个列表的拖拽属性:
class TextureSwatcherUI: def __init__(self): # ... 其他初始化代码 ... # 可用纹理列表:允许拖拽 self.available_textures = QListWidget() self.available_textures.setDragEnabled(True) self.available_textures.setSelectionMode(QListWidget.SingleSelection) # 选中纹理列表:使用自定义的可接收拖拽的组件 self.selected_textures = DropableListWidget() # ... 布局设置等 ...
这样拖拽后,目标列表中的项会自动继承源项的图标。
内容的提问来源于stack exchange,提问作者Kartikey Sinha
相关产品推荐
相关产品推荐

