带有图像列的QTableView

8 投票
3 回答
6280 浏览
提问于 2025-04-16 20:12

我有一个QTableView,用来以网格的形式显示数据库的一些信息。其中有一个字段是图片的路径,我想在表格中显示这些图片。

我尝试使用代理(delegate),但我对这个不太熟悉,结果没能成功。我也试过用角色(role)来实现:

    if index.column() == 4:
        if role == QtCore.Qt.DecorationRole:
            label = QtGui.QLabel()
            path = "path/to/my/picture.jpg"
            image = QtGui.QImage(str(path)) 
            pixmap = QtGui.QPixmap.fromImage(image)
            label.setPixmap(pixmap)
            return label

这段代码是我在另一个论坛找到的,听说是可以工作的。但是对我来说,它什么都没做,只是让我的代码执行变慢。

你知道为什么它不工作吗?如果你有一个使用代理的例子,我也会很感激!

谢谢你的关注

解决了:我用一个自定义代理搞定了。这里是我的代码,如果有人感兴趣的话:

class ImageDelegate(QtGui.QStyledItemDelegate):

    def __init__(self, parent):
        QtGui.QStyledItemDelegate.__init__(self, parent)

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

        painter.fillRect(option.rect, QtGui.QColor(191,222,185))

        # path = "path\to\my\image.jpg"
        path = "araignee_de_mer.jpg"

        image = QtGui.QImage(str(path))
        pixmap = QtGui.QPixmap.fromImage(image)
        pixmap.scaled(50, 40, QtCore.Qt.KeepAspectRatio)
        painter.drawPixmap(option.rect, pixmap) 

3 个回答

0

我觉得你不需要把Pixmap放在Label或者Image里面。试着直接返回Pixmap吧。

if index.column() == 4:
    if role == QtCore.Qt.DecorationRole:            
        path = "path/to/my/picture.jpg"
        pixmap = QtGui.QPixmap(path) 
        return pixmap
2

我在测试的时候,使用 drawPixmap(option.rect.x(), option.rect.y(), pixmap) 来绘制图标,这样就不需要再对图标进行缩放了。

class ImageDelegate(QtGui.QStyledItemDelegate):
    def __init__(self, parent=None):
        QtGui.QStyledItemDelegate.__init__(self, parent)
        #self.icon =icon
    def paint(self, painter, option, index):
        #painter.fillRect(option.rect, QtGui.QColor(191,222,185))
        # path = "path\to\my\image.jpg"
        path = "icon1.png"
        image = QtGui.QImage(str(path))
        pixmap = QtGui.QPixmap.fromImage(image)
        #pixmap.scaled(16, 16, QtCore.Qt.KeepAspectRatio)
        # when i test ,just use option.rect.x(), option.rect.y(), no need scaled 
        painter.drawPixmap(option.rect.x(), option.rect.y(),  pixmap)
4

谢谢你的解决方案和代码示例,Johanna。这对我帮助很大。

另外,如果还有其他人像我一样需要更详细的说明:

1) 为你的 QTableView 中显示图片的那一列设置项目代理(我是在 myTableView.init() 里做的),可以这样写:

self.setItemDelegateForColumn(1, yourImageDelegate(parent))

2) 在 yourImageDelegate 类中,你可能想要重写 sizeHint() 方法,以便设置你图片的大小,可以这样写:

def sizeHint(self, option, index) :
    return QSize(160, 90) # whatever your dimensions are

太棒了!

撰写回答