QTableWidget中如何让Qicon填满整个QTableWidgetItem或grid

How to make Qicon fill entire QTableWidgetItem or grid in QTableWidget

我做过QTableWidget,问题是如何在QtableWidget中制作一个Qicon来填充整个网格或QTableWidget,甚至拉伸网格的宽度或高度,谢谢。

代码如下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("QTableWidget Example")
        self.resize(400,300)
        self.layout=QHBoxLayout()
        self.TableWidget=QTableWidget(2,3)

        self.TableWidget.setHorizontalHeaderLabels(['Nmae','Sex','Weight(kG)'])

        self.newItem=QLineEdit('Jack')        
        self.TableWidget.setCellWidget(0,0,self.newItem)        

        self.newItem=QLineEdit('Male')        
        self.TableWidget.setCellWidget(0,1,self.newItem)        
        self.newItem=QLineEdit('160')        
        self.TableWidget.setCellWidget(0,2,self.newItem)     

        self.newItem=QTableWidgetItem(QIcon("./icon/1.png"),'')
        self.TableWidget.setItem(1,0,self.newItem) 

        self.newItem=QTableWidgetItem(QIcon("./icon/2.png"),'')
        self.TableWidget.setItem(1,1,self.newItem)

        self.newItem=QTableWidgetItem(QIcon("./icon/2.png"),'')
        self.TableWidget.setItem(1,2,self.newItem)
   

        self.layout.addWidget(self.TableWidget)

        self.setLayout(self.layout)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=Table()
    win.show()
    sys.exit(app.exec_())

您需要使用 item delegate,然后检查索引是否包含 装饰角色 的有效数据,如果是这样,请绘制它而不是使用默认绘画功能。

class ImageDelegate(QStyledItemDelegate):
    def paint(self, painter, opt, index):
        decoration = index.data(Qt.DecorationRole)
        if decoration is not None:
            if isinstance(decoration, QIcon):
                decoration = decoration.pixmap(opt.rect.size())
            # decoration role can also contain a QColor, we only want a pixmap
            if isinstance(decoration, QPixmap):
                painter.drawPixmap(opt.rect, decoration)
                return
        super().paint(painter, opt, index)


class Table(QWidget):
    # ...
    def initUI(self):
        # ...
        self.delegate = ImageDelegate(self.TableWidget)
        self.TableWidget.setItemDelegate(self.delegate)