如何将图标添加到 QListWidget

Posted

技术标签:

【中文标题】如何将图标添加到 QListWidget【英文标题】:How can I add Icons to a QListWidget 【发布时间】:2020-06-26 13:24:40 【问题描述】:

我有一个程序让您将文件拖放到 QListWidget 框中,然后单击按钮将这些文件上传到存储桶。我想用图标说明哪些文件已上传,哪些文件正在上传。有没有办法在 QListWidget 框内/旁边添加图标?

这里是 QListWidget 和拖放功能的一些代码。我只是希望有一种方法可以添加图标

import sys, os
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QPushButton
from PyQt5.QtCore import Qt, QUrl
 
class ListBoxWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.resize(600, 600)
 
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()
 
    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()
 
    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
 
            links = []
            for url in event.mimeData().urls():
                # https://doc.qt.io/qt-5/qurl.html
                if url.isLocalFile():
                    links.append(str(url.toLocalFile()))
                else:
                    links.append(str(url.toString()))
            self.addItems(links)
        else:
            event.ignore()
 
class AppDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(1200, 600)
 
        self.listbox_view = ListBoxWidget(self)
 
        self.btn = QPushButton('Get Value', self)
        self.btn.setGeometry(850, 400, 200, 50)
        self.btn.clicked.connect(lambda: print(self.getSelectedItem()))
 
    def getSelectedItem(self):
        item = QListWidgetItem(self.listbox_view.currentItem())
        return item.text()
 
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    demo = AppDemo()
    demo.show()
 
    sys.exit(app.exec_())

我尝试将 QIcon 添加到 self.addItems(links) 行,但它仍然给我一个关于参数的错误。

【问题讨论】:

【参考方案1】:

不要使用addItems 添加项目,而是创建单独的QListWidgetItems 并使用addItem(QListWidgetItem) 将它们一一添加。

def dropEvent(self, event):
    if event.mimeData().hasUrls():
        event.setDropAction(Qt.CopyAction)
        event.accept()

        for url in event.mimeData().urls():
            # https://doc.qt.io/qt-5/qurl.html
            if url.isLocalFile():
                address = str(url.toLocalFile())
                icon = QIcon('localIcon.png')
            else:
                address = str(url.toString())
                icon = QIcon('remoteIcon.png')
            self.addItem(QListWidgetItem(icon, address))

如果您想更改现有项目的图标,请使用item() 访问它并使用setIcon()

def setIconForItem(self, row, icon):
    self.listbox_view.item(row).setIcon(icon)
    

【讨论】:

我不再收到该错误,但我没有让图标出现。它应该出现在哪里?我需要把它移到右边吗?它当前是否被路径阻塞? 图标应该出现在左侧(如果您使用的是从右到左的语言,则应该出现在右侧),但前提是它已正确加载。检查图标文件的文件路径。 当我尝试代码的第二部分 self.listbox_view.item(row).setIcon(icon) 我收到错误 AttributeError: "NoneType" object has no attribute "setIcon" 您应该检查该行号处是否确实存在项目。

以上是关于如何将图标添加到 QListWidget的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义图标添加到 Oro 前台菜单项?

如何将图标添加到 React Native 应用程序

如何将图标添加到嵌套在 JS 中的 HTML

如何将图标添加到 WPF 应用程序桌面快捷方式?

如何将图标添加到 MUI 数据表的标题

如何将图标添加到控制台应用程序