带有一列图像的QTableView

时间:2011-06-24 07:31:59

标签: python image pyqt qtableview

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

答案 0 :(得分:2)

感谢您提供解决方案和代码示例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

Swoot!

答案 1 :(得分:1)

当我测试时,我使用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)

答案 2 :(得分: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