使用QItemDelegate在PyQt5中的表中显示图标代替文本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (667)

使用PyQt5我试图使用QItemDelegate在表格的单元格中显示图标而不是文本字符串。基本上我使用以下方法构造QItemDelegate的子类:

de = MyDelegate(self.attribute_table_view)

dself.attribute_table_view是一个`QTableView'对象。

我尝试使用以下方法在特定列的每个单元格中绘制一个图标:

class MyDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
    QItemDelegate.__init__(self, parent, *args)

def paint(self, painter, option, index):

    painter.save()
    value = index.data(Qt.DisplayRole)

    line_1x = QPixmap('line_1x.png')

    painter.setBrush(Qt.gray)
    painter.setPen(Qt.black)
    painter.drawPixmap(QRectF(0, 0, 48, 24), line_1x, QRectF(0, 0, 48, 24))
    painter.restore()

随着painter.drawPixmap()我怎么告诉它在每个单元绘制像一个表使用实现painter.drawText(option.rect, Qt.AlignVCenter, value)

此外,我注意到,如果我输入.png文件不存在的文件名,我当前的脚本不会报告任何错误。如果.png文件不存在,是否应报告错误?

我当前的模型是QgsAttributeTableModel,我想渲染一列中所有单元格的当前字符串值,其中图标使用的图标取决于字符串值。

提问于
用户回答回答于

在这个答案中我将展示几种方法,您可以根据问题的复杂性进行选择。

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(path) for path in ["clear.png", "heart.png","marker.png", "pen.png"]]
delegate = MyDelegate(icons, self.attribute_table_view)
self.attribute_table_view.setItemDelegateForColumn(column_icon, delegate)

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励