带有图像列的QTableView
我有一个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
太棒了!