В этом ответе я покажу несколько методов, и вы сможете выбирать в зависимости от сложности задачи.
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](https://i.stack.imgur.com/HNVb3.png)
Я заметил, что мой текущий скрипт не сообщает об ошибках, если я ввожу имя файла, которое не существует для файла .png.Если сообщается об ошибке, если файл .png не существует?
Qt не будет уведомлять, если файл не существует, вы должны проверить, например, с помощью функции isNull()
.Есть 2 способа уведомления:
1. Первый - вернуть логическое значение, указывающее, загружены данные или нет, но при использовании конструктора он возвращает только созданный объект и выбрасывает.
Запускать исключения, это потребляет много ресурсов, которые Qt считает ненужными, поэтому вы никогда не будете его использовать.
Другой способ, который особенно Qt уведомляет, что есть ошибка, - через сигналы, но это только для QObjectи QIcon, QPixmap, QImage не являются объектами QObject.
Таким образом, в заключение ответственность за проверку или нет ложится на разработчика.