You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

tool ui

问题描述

如截图所示,希望为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:16:39