4

I want to add an icon to my QTableWidget. However, the icon being added is pretty small, so I try to find a way to resize the icon

I have tried using setSizeHint(), but it didn't work. So I thought of creating a pixmap and set the pixmap in QLabel, but I couldn't figure out to convert the QLabel into QTabelWidgetItem.

this is the code in two different approaches

##this is when I try to use setSizeHint()
class test_UI(Ui_MainWindow,QtWidgets.QMainWindow)
    def set_icon(self):
        icon_item=QtWidgets.QTableWidgetItem()
        icon_item.setSizeHint(QtCore.QSize(100,100))
        icon_item.setIcon(QtGui.QIcon("Kevin_test.png"))
        self.tableWidget.setItem(0,1,icon_item)
##this is when I try to use pixmap to put it inside the table
class test_UI(Ui.MainWindow,QtWidgets.QMainWindow)
    def set_icon(self):
        icon_item=QtWidgets.QTableWidgetItem(self.label)
        icon_item.setFlags(QtCore.Qt.ItemIsEditable)
        self.tableWidget.setItem(0,1,icon_item)
    def build_icon(self):
        self.icon = QtGui.QIcon("Kevin_test.png")
        self.label=QtWidgets.QLabel('pic',self)
        self.label.setFixedSize(300,300)
    pixmap1=self.icon.pixmap(100,100,QtGui.QIcon.Active,QtGui.QIcon.On)
        self.label.setPixmap(pixmap1)

For the first approach, I expect the size of the icon to change but it did not.

For the second approach, my program crash because there is no overload call to make QTableWidgetItem with a QLabel.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
James
  • 57
  • 3

1 Answers1

2

There are at least the following methods:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Delegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        option.decorationSize = index.data(QtCore.Qt.SizeHintRole)


def main(args):
    app = QtWidgets.QApplication(args)

    # sol1
    widget_1 = QtWidgets.QTableWidget(1, 1)

    it1 = QtWidgets.QTableWidgetItem()
    widget_1.setItem(0, 0, it1)
    it1.setIcon(QtGui.QIcon("so-logo.png"))
    it1.setSizeHint(QtCore.QSize(100, 100))
    widget_1.setIconSize(QtCore.QSize(100, 100))

    # sol2
    widget_2 = QtWidgets.QTableWidget(1, 1)

    it2 = QtWidgets.QTableWidgetItem()
    widget_2.setItem(0, 0, it2)
    label = QtWidgets.QLabel()
    pixmap = QtGui.QPixmap("so-logo.png")
    """ scaled
    pixmap = pixmap.scaled(
        QtCore.QSize(400, 400),
        QtCore.Qt.KeepAspectRatio,
        QtCore.Qt.SmoothTransformation,
    )"""
    size = pixmap.size()
    label.setPixmap(pixmap)
    it2.setSizeHint(size)
    label.setFixedSize(size)
    widget_2.setCellWidget(0, 0, label)

    # sol3
    widget_3 = QtWidgets.QTableWidget(1, 1)

    it3 = QtWidgets.QTableWidgetItem()
    widget_3.setItem(0, 0, it3)
    it3.setIcon(QtGui.QIcon("so-logo.png"))
    it3.setSizeHint(QtCore.QSize(100, 100))
    delegate = Delegate(widget_3)
    widget_3.setItemDelegate(delegate)

    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    lay.addWidget(widget_1)
    lay.addWidget(widget_2)
    lay.addWidget(widget_3)
    w.show()

    ret = app.exec_()

    return ret


if __name__ == "__main__":
    sys.exit(main(sys.argv))

Explanation:

  • By default the icon size is taken based on the iconSize property.

  • The QLabel can be added using the setCellWidget() method.

  • You can use a delegate to set the icon size.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
  • thank you very much! it works. Just a quick question. Where you had widget_2.setCellWidget(it2,label), how come it doesn't return an error for you? for me it did. setCellWidget take in row, column, and the widget but not QTableWidgetItem which is it2. thank you. – James Oct 16 '19 at 22:39
  • @James Yes it is a mistake, at the beginning I published my answer for QListWidget but then I realized the error, and it seems that I did not correct all the cases. – eyllanesc Oct 16 '19 at 22:40