如何通过使用QStyledItemDelegate定制QItemlist来更改项目图标取决于条件?

时间:2019-05-09 22:11:25

标签: python pyqt pyqt5

我用自定义itemwidget构建了一个QListwidget这个列表。我想更改项目图标的想法取决于条件。我阅读了有关MVC模型的信息,但我不知道如何构建QStyledItemDelegate来更新它们。

现在,我删除列表中的所有项目并阅读它们,如果列表较小,则可以使用,但是当我有很多项目时,这会花费一些时间。

CostmItemWidget的此代码:

class CustomQWidget(QWidget):
    def __init__(self, file, parent=None):
        super(CustomQWidget, self).__init__(parent)
        if file["l_file"]:
            pathname = os.path.join(parent.parent.main_script_path, "icons/correct.png")
        else:
            pathname = os.path.join(parent.parent.main_script_path, "icons/wrong.png")
        pixmap = QtGui.QPixmap(pathname)
        button = QPushButton()
        button.setStyleSheet("padding: 0px;")
        button.setFixedSize(16, 16)

        # resize pixmap
        pixmap = pixmap.scaled(button.size(), QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation)

        cropOffsetX = (pixmap.width() - button.size().width()) / 2
        pixmap = pixmap.copy(cropOffsetX, 0, button.size().width(), button.size().height())

        button.setIcon(QtGui.QIcon(pixmap))
        button.setIconSize(button.size())
        button.setFlat(True)
        label = QLabel(file["n_file"])
        layout = QHBoxLayout()
        layout.addWidget(button, 0)
        layout.addWidget(label, 0)
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

窗口小部件内容列表的此代码:

class FileListWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        loadUi(os.path.join(".", "UIFiles", 'filelist_widget.ui'), self)
        self.parent = parent
        self.refresh_list()
        self.list_view.setCurrentRow(0)
        self.list_view.itemClicked.connect(self.selected_file)
        self.list_view.setStyleSheet("QListWidget::item { padding: 0px; }")

    def refresh_list(self):
        self.list_view.clear()
        if len(self.parent.files) == 0:
            return
        for index, file in self.parent.files.iterrows():
            self.add_item_list(file)
        self.parent.image_deleted = False

    def add_item_list(self, file):
        item = QListWidgetItem(self.list_view)
        item.setSizeHint(QSize(item.sizeHint().width(), 20))
        item_widget2 = CustomQWidget(file, self)
        self.list_view.addItem(item)
        self.list_view.setItemWidget(item, item_widget2)

我希望找到一种应用QStyledItemDelegate并通过特定信号更改图标的方法。 CustomQWidget中按钮的图标,当字典中“ l_file”的值为True时,我想对其进行更改。

我有这张清单的图片

1 个答案:

答案 0 :(得分:0)

我创建了这个委托来处理QListItemWidget的自定义Widget中的放置图标。

class FileListDelegate(QStyledItemDelegate):
def __init__(self, parent, list_view):
    super(FileListDelegate, self).__init__(parent)
    # pointer to list
    self.list_view = list_view

def paint(self, painter: QtGui.QPainter, option: QStyleOptionViewItem, index: QtCore.QModelIndex) -> None:
    painter.save()
    item = self.list_view.itemFromIndex(index)
    widget = self.list_view.itemWidget(item)
    layout = widget.layout()
    button = layout.itemAt(0).widget()
    if self.list_view.parent().parent().parent.files.loc[widget.index, 'l_file']:
        pathname = os.path.join(widget.main_script_path, "icons/correct.png")
    else:
        pathname = os.path.join(widget.main_script_path, "icons/wrong.png")
    pixmap = QtGui.QPixmap(pathname)
    button.setIcon(QtGui.QIcon(pixmap))
    button.setIconSize(button.size())
    painter.restore()