pythonpyqtqtablewidgetqtablewidgetitem

Adding images to a QTableWidget in PyQt


I'm very new to Python and even newer to PyQt. I've managed to create a table, but want to add images in certain cells. I've read that I need to subclass the QTableWidget class, or possibly the QTableWidgetItem class and re-implement the QPaintEvent. If anyone has an example of what goes into re-implementing the QPaintEvent I would really appreciate it.

Thanks, Stephen


Solution

  • 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_())
    

    Two ways of doing it, since you asked for the painEvent.

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

    Hope this helps.

    Edit: Added requested solution using a QTableWidget subclass.

    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_())