Использование QItemDelegate для отображения значков вместо текста в таблице в PyQt5 - PullRequest
0 голосов
/ 28 сентября 2018

В PyQt5 я пытаюсь использовать QItemDelegate для отображения значка вместо текстовой строки в ячейке таблицы.По сути, я создаю подкласс QItemDelegate, используя:

de = MyDelegate(self.attribute_table_view)

Здесь dself.attribute_table_view - это объект `QTableView '.

Я пытаюсь нарисовать значок в каждой ячейке в определенном столбце, используя:

class MyDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
    QItemDelegate.__init__(self, parent, *args)

def paint(self, painter, option, index):

    painter.save()
    value = index.data(Qt.DisplayRole)

    line_1x = QPixmap('line_1x.png')

    painter.setBrush(Qt.gray)
    painter.setPen(Qt.black)
    painter.drawPixmap(QRectF(0, 0, 48, 24), line_1x, QRectF(0, 0, 48, 24))
    painter.restore()

С painter.drawPixmap() как мне сказать, чтобы он рисовал в каждой ячейке таблицы, как это делается с использованием painter.drawText(option.rect, Qt.AlignVCenter, value)?

Кроме того, я заметил, что мой текущийСкрипт не сообщает об ошибках, если я ввожу имя файла, которое не существует для файла .png.Следует ли сообщать об ошибке, если файл .png не существует?

Моя текущая модель - QgsAttributeTableModel , и я хочу отобразить текущее строковое значение для всех ячеек в одном столбце со значком гдеиспользуемый значок зависит от строкового значения.

1 Ответ

0 голосов
/ 28 сентября 2018

В этом ответе я покажу несколько методов, и вы сможете выбирать в зависимости от сложности задачи.

1.Количество значков фиксировано, и один столбец будет использоваться повторно.

Логика состоит в том, чтобы загрузить значки один раз и передать их в качестве атрибута делегату, затем в зависимости от вашей логики вы получите значок спискапоскольку он изменяет get_icon() метод.и мы рисуем иконку с помощью метода paint() QIcon.

class MyDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, icons, parent=None):
        super(MyDelegate, self).__init__(parent)
        self._icons = icons

    def get_icon(self, index):
        # get the icon according to the condition:
        # In this case, for example, 
        # the icon will be repeated periodically
        icon =  self._icons[ index.row() % len(self._icons) ]
        return icon

    def paint(self, painter, option, index):
        icon = self.get_icon(index)
        icon.paint(painter, option.rect, QtCore.Qt.AlignCenter)

Как повторно использовать столбец, вы должны использовать метод setItemDelegateForColumn(), чтобы задать делегату столбец

self.attribute_table_view = QtWidgets.QTableView()
self.attribute_table_view.setModel(your_model)

column_icon = 1
icons = [QtGui.QIcon(QtCore.QDir.current().absoluteFilePath(name)) for name in ["clear.png", "heart.png","marker.png", "pen.png"]]
delegate = MyDelegate(icons, self.attribute_table_view)
self.attribute_table_view.setItemDelegateForColumn(column_icon, delegate)

enter image description here

Я заметил, что мой текущий скрипт не сообщает об ошибках, если я ввожу имя файла, которое не существует для файла .png.Если сообщается об ошибке, если файл .png не существует?

Qt не будет уведомлять, если файл не существует, вы должны проверить, например, с помощью функции isNull().Есть 2 способа уведомления:

1. Первый - вернуть логическое значение, указывающее, загружены данные или нет, но при использовании конструктора он возвращает только созданный объект и выбрасывает.

Запускать исключения, это потребляет много ресурсов, которые Qt считает ненужными, поэтому вы никогда не будете его использовать.

Другой способ, который особенно Qt уведомляет, что есть ошибка, - через сигналы, но это только для QObjectи QIcon, QPixmap, QImage не являются объектами QObject.

Таким образом, в заключение ответственность за проверку или нет ложится на разработчика.

...