pythonpyqtpyqt5qtablewidgetitemqicon

Centering a QIcon in a QTableWidgetItem in PyQt5


I have a QTableWidget in which some of the QTableWidgetItem's contain a single QIcon (not a button, not clickable, just an image). Can anybody advise me on how to center the icon? I am providing below some sample code which correctly displays the icon, but fails to center it (setTextAlignment seems to work for the items that contain text but apparently not for icons).

status_item = QtGui.QTableWidgetItem()
status_icon = QtGui.QIcon()
status_icon.addPixmap(QtGui.QPixmap(icon_file), QtGui.QIcon.Normal, QtGui.QIcon.Off)
status_item.setIcon(status_icon)
self.ServiceTableWidget.setItem(row, 0, status_item)
self.ServiceTableWidget.item(row, 0).setTextAlignment(QtCore.Qt.AlignHCenter) #not working

I have also tried using the QIcon.paint() method, which did not work, although I may be implementing it incorrectly:

status_icon.paint(QtGui.QPainter(), QtCore.QRect(), QtCore.Qt.AlignCenter)

Thanks in advance!


Solution

  • You can use a delegate:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class IconDelegate(QtWidgets.QStyledItemDelegate):
        def initStyleOption(self, option, index):
            super(IconDelegate, self).initStyleOption(option, index)
            if option.features & QtWidgets.QStyleOptionViewItem.HasDecoration:
                s = option.decorationSize
                s.setWidth(option.rect.width())
                option.decorationSize = s
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.ServiceTableWidget = QtWidgets.QTableWidget(3, 3)
    
            delegate = IconDelegate(self.ServiceTableWidget)  # <--- 
            self.ServiceTableWidget.setItemDelegate(delegate) # <---
    
            icon_file = "lamp.png"
            status_item = QtWidgets.QTableWidgetItem()
            status_icon = QtGui.QIcon()
            status_icon.addPixmap(QtGui.QPixmap(icon_file), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            status_item.setIcon(status_icon)
            self.ServiceTableWidget.setItem(0, 0, status_item)
    
            self.setCentralWidget(self.ServiceTableWidget)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication.instance()
        if app is None:
            app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    

    enter image description here