#python #qt #pyqt
#python #qt #pyqt
Вопрос:
Я использую QTableView и QSqlTableModel для отображения данных из базы данных sqlite. В базе данных (и модели) есть столбец с полями, которые содержат либо пути, т.е.: ‘/home/foo/bar.txt — или ничего. Для этого столбца в представлении я хотел бы отобразить один значок для элементов с путем и другой значок для элементов без ничего (и вообще не отображать фактические данные / путь в представлении).
Я думаю, мне нужно настроить QStyledItemDelegate для рендеринга значков вместо данных, но staritemdelelgate из включенных примеров выделяет функцию редактора делегата (которая мне не нужна), не проливая никакого света на то, как рендерить QIcons (или, может быть, я просто ее пропускаю). Я просмотрел API, но мне неясно, как создать подкласс QStyledItemDelegate, или даже нужно ли мне это для этого варианта использования.
Было бы полезно получить некоторые рекомендации о том, является ли это жизнеспособным методом, или пример того, как использовать QStyledItemDelegate для рендеринга значков для столбца (предпочтительно на python).
РЕДАКТИРОВАТЬ: сообщение Петра решило проблему. Полная реализация ситуации, которую я описал, на основе решения Петра:
def data(self, index, role=QtCore.Qt.DisplayRole):
if index.column() == 2:
if role == QtCore.Qt.DecorationRole:
filename = super(MovieModel, self).data(index, QtCore.Qt.DisplayRole)
if not filename == '':
return self.yes_icon
else:
return self.no_icon
elif role == QtCore.Qt.DisplayRole:
return ''
#Other columns/roles:
return super(MovieModel, self).data(index, role)
Надеюсь, это поможет.
Ответ №1:
Вместо подкласса делегата вы можете подклассировать модель и вернуть значок в элементе DecorationRole
.
Непроверенный эскиз решения:
class IconModel(QSqlTableModel):
def data(self, index, role=Qt.DisplayRole):
if index.column() == FILENAME_COLUMN_INDEX:
if role == Qt.DecorationRole:
filename = super(IconModel, self).data(index, Qt.DisplayRole)
return icon_for_filename(filename)
elif role == Qt.DisplayRole:
return ''
# Other columns/roles:
return super(IconModel, self).data(index, role)
Разделение делегатов на подклассы доставляет гораздо больше хлопот.
Комментарии:
1. Подкласс модели работал без добавления делегата. Спасибо!