带有图像列的QTableView

8

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

我尝试使用代理来实现这个功能,但我不太熟悉它们,也无法做到任何事情。我还尝试使用角色:

    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个回答

4
感谢您提供的解决方案和代码示例,Johanna。这对我非常有帮助。
此外,如果其他人需要像我一样详细说明:
1)设置QTableView的带图像列的项代理(我在myTableView.init()中完成了此操作),如下所示:
self.setItemDelegateForColumn(1, yourImageDelegate(parent))

2)在您的ImageDelegate类中,您可能想要重载sizeHint()以获得图像的大小,如下所示:

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

嗨!

如果每行有多个图像路径,我该如何将路径传递给委托?谢谢。 - unice

2

在测试时,我使用 drawPixmap(option.rect.x(), option.rect.y(), pixmap) 绘制图标,不需要进行 pixmap.scaled 处理。

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)

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

1
谢谢您的关注,但似乎没有任何区别。我认为它计算像素图,因为网格需要几秒钟才能加载,通常是立即的。但它不显示任何内容。 - Johanna
我怀疑问题出在你代码的其他部分。你确定你有正确的列吗? - Stephen Terry
我最终使用自定义委托使其工作。我将我的代码发布在我的问题中。 - Johanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接