Как изменить значок элемента с помощью QStyledItemDelegate для настраиваемого списка QItem, зависит от условия? - PullRequest
0 голосов
/ 10 мая 2019

Я создаю QListwidget с пользовательским itemwidget этим списком.Идея, что я хочу изменить значок элемента, зависит от состояния.Я читал о модели 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 голосов
/ 12 мая 2019

Я создал этот делегат для обработки значка размещения внутри пользовательского виджета QListItemWidget.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...