在PyQt中向QTableWidget添加图片

10

我对Python和PyQt都非常陌生。我已经创建了一个表格,但想在某些单元格中添加图像。我读到,需要子类化QTableWidget类或可能是QTableWidgetItem类,并重新实现QPaintEvent。如果有人有关于重新实现QPaintEvent的示例,我将不胜感激。

谢谢, Stephen

3个回答

16
from PyQt4 import QtGui
import sys

imagePath = "enter the path to your image here"

class ImgWidget1(QtGui.QLabel):

    def __init__(self, parent=None):
        super(ImgWidget1, self).__init__(parent)
        pic = QtGui.QPixmap(imagePath)
        self.setPixmap(pic)

class ImgWidget2(QtGui.QWidget):

    def __init__(self, parent=None):
        super(ImgWidget2, self).__init__(parent)
        self.pic = QtGui.QPixmap(imagePath)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawPixmap(0, 0, self.pic)


class Widget(QtGui.QWidget):

    def __init__(self):
        super(Widget, self).__init__()
        tableWidget = QtGui.QTableWidget(10, 2, self)
        tableWidget.setCellWidget(0, 1, ImgWidget1(self))
        tableWidget.setCellWidget(1, 1, ImgWidget2(self))

if __name__ == "__main__":
    app = QtGui.QApplication([])
    wnd = Widget()
    wnd.show()
    sys.exit(app.exec_())

有两种方法可以做到这一点,因为你要求疼痛事件。

来源:http://www.mail-archive.com/pyqt@riverbankcomputing.com/msg01259.html

希望能帮到你。
编辑:添加了使用QTableWidget子类的请求解决方案。

from PyQt4 import QtGui
import sys

class ImageWidget(QtGui.QWidget):

    def __init__(self, imagePath, parent):
        super(ImageWidget, self).__init__(parent)
        self.picture = QtGui.QPixmap(imagePath)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawPixmap(0, 0, self.picture)


class TableWidget(QtGui.QTableWidget):

    def setImage(self, row, col, imagePath):
        image = ImageWidget(imagePath, self)
        self.setCellWidget(row, col, image)

if __name__ == "__main__":
    app = QtGui.QApplication([])
    tableWidget = TableWidget(10, 2)
    tableWidget.setImage(0, 1, "<your image path here>")
    tableWidget.show()
    sys.exit(app.exec_())

1
谢谢,这帮了我很多。是否可以通过子类化QTableWidget类来创建类似于tableWidget.setImage(imagePath)的东西?或者这需要太多的努力,不值得去做? - Stephen
当我看到黑白分明的东西时,它似乎是如此显而易见。谢谢。 - Stephen
很高兴能够帮助。如果有机会,请随意接受这个答案 :) - aukaost
我希望这是一个快速简单的问题。如果你要改变外观和感觉(当单元格被点击时发生什么,标题的颜色和格式等),是修改QTableWidget更容易,还是使用QTableView和QModel创建自己的表格更容易? - Stephen
很抱歉,我对Qt的Model/View类没有太多经验。个人而言,我会尝试使用提供的小部件来完成所需的功能。到目前为止,我已经做到了。 - aukaost
当使用单元格小部件而不是表项时,是否可以设置特定单元格的背景颜色? - TheCodeLearner

2
我认为这个解决方案对于我这种初学者来说非常友好:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class KindForMind(object):
    def THINK(self, PLEASE):
        self.table = QtWidgets.QTableWidget()
        pic = QtGui.QPixmap("your_image.jpg")
        self.label = QtWidgets.QLabel(PLEASE)
        self.label.setPixmap(pic)
        self.table.setCellWidget(0,0, self.label)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    PLEASE = QtWidgets.QWidget()
    ui = KindForMind()
    ui.THINK(PLEASE)
    PLEASE.show()
    sys.exit(app.exec_())

0

首先,您应该使用以下代码将您的OpenCV图像转换为QPixmap格式:

def convert_cv_qt(self, cv_img):
    rgb_image = cv.cvtColor(cv_img, cv.COLOR_BGR2RGB)
    h, w, ch = rgb_image.shape
    bytes_per_line = ch * w
    convert_to_Qt_format = QtGui.QImage(rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format.Format_RGB888)
    p = convert_to_Qt_format.scaled(cv_img.shape[0], cv_img.shape[1], Qt.AspectRatioMode.KeepAspectRatio)
    return QPixmap.fromImage(p)

然后你可以像这样将图像插入到QTable中:

qt_img = convert_cv_qt(cv_img)

rowPosition = table.rowCount()
table.insertRow(rowPosition)
table.setItem(rowPosition, 0, QTableWidgetItem('(My Text)'))
table.setItem(rowPosition, 1, QTableWidgetItem('datetime(2019, 5, 4)'))
table.setCellWidget(rowPosition, 2,self.getImageLabel(qt_img))

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