如何使用QStyledItemDelegate为列渲染QIcons?

时间:2011-10-29 19:22:14

标签: python qt pyqt

我正在使用QTableView和QSqlTableModel来显示来自sqlite DB的数据。在DB(和模型)中,有一列包含路径的字段,即:'/ home / foo / bar.txt'或什么都没有。对于视图中的此列,我想为具有路径的项目呈现一个图标,为没有项目的项目呈现不同的图标(并且根本不呈现视图中的实际数据/路径)。 我认为我需要设置一个QStyledItemDelegate来代替数据来渲染图标,但是包含的示例中的staritemdelelgate突出显示了委托的编辑器功能(我不想要)而不会消除任何光线关于如何渲染QIcons(或者我可能只是想念它)。我查看了API,但我不清楚如何子类化QStyledItemDelegate,或者即使我需要这个用例。
关于这是否是一个可行的方法,或者如何使用QStyledItemDelegate来呈现列的图标(最好是在python中)的一些指导将不胜感激。

编辑:彼得的帖子解决了这个问题。根据Petr的解决方案,我所描述的情况的全面实施是:

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 个答案:

答案 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)

对代表进行子类化更是一种痛苦。