我正在使用QTableView和QSqlTableModel来显示来自sqlite DB的数据。在DB(和模型)中,有一列包含路径的字段,即:'/ 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)
希望它有所帮助。
答案 0 :(得分: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)
对代表进行子类化更是一种痛苦。