Аргумент option в QStyledItemDelegate

Я пишу приложение на PyQt. Мне нужно адаптировать размер элемента, унаследованного от QStyledItemDelegate в зависимости от размера окна. Проблема заключается в том, что при увеличении ширины окна, элемент ожидаемо увеличивается, при уменьшении же в определённый момент перестаёт. Вот мой код:

import sys

from PyQt5.QtCore import (
    QAbstractListModel,
    QMargins,
    Qt,
    QSize,
    QRect,
)
from PyQt5.QtGui import (
    QColor,
    QPainter,
    QFont,
    QFontMetrics,
)
from PyQt5.QtWidgets import (
    QApplication,
    QListView,
    QMainWindow,
    QVBoxLayout,
    QWidget,
    QStyledItemDelegate,
)

class Defines():
    BUBBLE_PADDING = QMargins(15, 5, 15, 5)
    TEXT_PADDING = QMargins(25, 15, 25, 15)
    FONT_SIZE = 14
    FONT_STYLE = "Times"

class MessageDelegate(QStyledItemDelegate):
    font = 0

    def __init__(self, font, *args, **kwargs):
        super(MessageDelegate, self).__init__(*args, **kwargs)
        self.font = font

    def paint(self, painter, option, index):
        text = index.model().data(index, Qt.DisplayRole)
        print(option.rect.size())
        size = self.sizeHint(option, index)
        rect = QRect(option.rect.right() - size.width() - 20, option.rect.y(), size.width(), size.height())
        bubblerect = rect.marginsRemoved(Defines.BUBBLE_PADDING)
        textrect = rect.marginsRemoved(Defines.TEXT_PADDING)
        painter.setPen(Qt.cyan)
        painter.setBrush(Qt.cyan)
        painter.drawRoundedRect(bubblerect, 10, 10)
        painter.setPen(Qt.black)
        painter.setFont(self.font)
        painter.drawText(textrect, Qt.TextWordWrap, text)

    def sizeHint(self, option, index):
        text = index.model().data(index, Qt.DisplayRole)
        metrics = QFontMetrics(self.font)
        rect = option.rect.marginsRemoved(Defines.TEXT_PADDING)
        rect = metrics.boundingRect(rect, Qt.TextWordWrap, text)
        rect = rect.marginsAdded(Defines.TEXT_PADDING)
        return rect.size()


class MessageModel(QAbstractListModel):
    def __init__(self, *args, **kwargs):
        super(MessageModel, self).__init__(*args, **kwargs)
        self.messages = []

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self.messages[index.row()]

    def rowCount(self, index):
        return len(self.messages)

    def add_message(self, text):
        if text:
            self.messages.append(text)
            self.layoutChanged.emit()


class MainWindow(QMainWindow):
    font = 0

    def __init__(self):
        super(MainWindow, self).__init__()
        self.font = QFont(Defines.FONT_STYLE, Defines.FONT_SIZE)
        self.setMinimumSize(int(QApplication.primaryScreen().size().width() * 0.1), int(QApplication.primaryScreen().size().height() * 0.2))
        self.resize(int(QApplication.primaryScreen().size().width() * 0.3), int(QApplication.primaryScreen().size().height() * 0.5))
        main_layout = QVBoxLayout()
        self.messages = QListView()
        self.messages.setItemDelegate(MessageDelegate(self.font))
        self.model = MessageModel()
        self.messages.setModel(self.model)
        main_layout.addWidget(self.messages)
        self.w = QWidget()
        self.w.setLayout(main_layout)
        self.setCentralWidget(self.w)
        self.model.add_message("Hello, world! Hello, world! Hello, world! Hello, world!")


app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

Размер элемента зависит от параметра option метода paint. Я вывожу размер, который получаю в этом аргументе. Я заметил, что моя проблема связана именно с этим параметром, так как значение ширины option.rect.size() также перестаёт убывать, хотя я продолжаю сужать окно. Я не знаю, с чем это связано, но чем длиннее фигура, которую я отрисовываю в paint, тем больше значение ширины option.rect, на котором останавливается убывание. С чем это связано и как можно получить корректное значение option.rect при сужении окна?


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