python - 如何使用 QStyledItemDelegate 呈现列的 QIcons?

标签 python qt pyqt

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

编辑:Petr 的帖子解决了这个问题。基于 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)  

希望有帮助。

最佳答案

您可以对模型进行子类化,并在项目的 DecorationRole 中返回图标,而不是对委托(delegate)进行子类化。

未经测试的解决方案草图:

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)

对委托(delegate)进行子类化更加痛苦。

关于python - 如何使用 QStyledItemDelegate 呈现列的 QIcons?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941123/

相关文章:

python - 从 Tornado Python 中的 RequestHandler 访问 URL

python - name, *line = input().split() 在 python 3 中如何工作?

c++ - 从 C 程序使用 Qt 库

python - try catch 鼠标位置时,QTreeView 上的 DoubleClick 事件没有结果

python - python通过套接字接收图像

QByteArray 转换的 Qt 优化

c++ - 在 VC++ 和 Qt 应用程序之间使用共享内存进行通信

python - 在文件夹层次结构中构建文件菜单

python - QLineEdit 拿不到任何东西

python - 尝试获取列表列表中最大 y 值的总和([[x,y],[x,y]......)