Как задать размеры svg изображения в setCellWidget QTableWidget?

Сгенерировал штрих-код в формате .svg через библиотеку python-barcode.
С помощью класса QSvgWidget отобразил .svg.

def generation_barcode_svg(self, value):
    file = barcode.get('code128', value)
    file_svg = file.save('barcode_in_header')
    svgWidget = QSvgWidget('barcode_in_header.svg')
    return svgWidget

С помощью метода setCellWidget отобразил файл .svg в ячейке таблицы QTableWidget.

self.table.setCellWidget(6, 1, self.generation_barcode_svg(self.data_product_bar_code)) 

Теперь хочу задать размеры файлу .svg, чтобы он "растянулся" по всей площади ячейки.
Подскажите, пожалуйста, как это можно сделать?


Ответы (1 шт):

Автор решения: S. Nick

ImageWriter Renders штрих -коды как изображение. Поддерживает все форматы изображений, поддерживаемые Pillow. Defaults to PNG.

Класс QStyleDiteMDelegate предоставляет средства отображения и редактирования для элементов данных из модели.

import sys
import barcode
from barcode.writer import ImageWriter
from PyQt5 import QtGui, QtWidgets

# !!! +++                    vvvvvvvvvvvvvvvvvvv
class IconDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(IconDelegate, self).initStyleOption(option, index)
        option.decorationSize = option.rect.size()
# !!! +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
         
        self.data_product_bar_code = '123456789012'
        
        self.tableWidget = QtWidgets.QTableWidget(5, 3)
        self.tableWidget.verticalHeader().setDefaultSectionSize(70)    #+
        self.tableWidget.horizontalHeader().setDefaultSectionSize(150) #+

        delegate = IconDelegate(self.tableWidget)                  # +++
        self.tableWidget.setItemDelegateForColumn(2, delegate)     # +++ 
# +          vvv
        file_png = self.generation_barcode_svg(
            self.data_product_bar_code)
            
        item = QtWidgets.QTableWidgetItem(
            QtGui.QIcon(file_png), "")
# !!! +++   ^^^^^^^^^^^^^^^^^^^^^
        self.tableWidget.setItem(1, 2, item)            

        layout = QtWidgets.QVBoxLayout(self.centralWidget)
        layout.addWidget(self.tableWidget)
 
    def generation_barcode_svg(self, value):
        # Common Writer Options https://pythonhosted.org/pyBarcode/writers/index.html
        render_options = {
            "module_width": 0.35,
            "module_height": 10,
            "font_size": 18, 
            "text_distance": 1,
            "quiet_zone": 3.1,
        }    
    
#-      file = barcode.get('code128', value)
        file = barcode.get(
            "code128", 
            value, 
            writer=ImageWriter())  #https://python-barcode.readthedocs.io/en/stable/writers.html?highlight=writer#imagewriter 
# !!! +++   ^^^^^^^^^^^^^^^^^^^^        
        file_png = file.save('barcode_in_header', render_options)
# !!! +++                                         ^^^^^^^^^^^^^^ 
        print(f'\nfile_png = {file_png};\n\n') # 
        
        return file_png


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(700, 500)
    w.show()
    sys.exit(app.exec_()) 

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка