Задать вопрос
@wintreist

QT. Почему resizeEvent реагирует на изменение подвиджетов и что с этим делать?

Здравствуйте, столкнулся с проблемой, что resizeEvent запускается, когда я в нем (resizeEvent) изменяю pixmap у QLabel, которая является подвиджетом QWidget в моей программе.
Код, для понимания:
class EjectedObject(QWidget, Ui_Form_Ejected_Object):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
    def resizeEvent(self, event: QResizeEvent = None) -> None:
        pixmap = QPixmap()
        pixmap.loadFromData(self.image_data)
        original_image_size = cv2.imdecode(
            np.frombuffer(self.image_data, np.uint8), -1).shape
        width_ratio = event.size().width() / original_image_size[0]
        height_ratio = event.size().height() / original_image_size[1]
        scale_ratio = min(width_ratio, height_ratio)
        pixmap = pixmap.scaled(
            int(original_image_size[0] * scale_ratio),
            int(original_image_size[1] * scale_ratio),
        )
        self.label_image.setPixmap(pixmap)
        self.label_image.setAlignment(Qt.AlignmentFlag.AlignCenter)
        event.accept()
        pass

Структура Ui_Form_Ejected_Object
class Ui_Form_Ejected_Object(object):
    def setupUi(self, Form_Ejected_Object):
        Form_Ejected_Object.setObjectName("Form_Ejected_Object")
        Form_Ejected_Object.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form_Ejected_Object)
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox = QtWidgets.QGroupBox(parent=Form_Ejected_Object)
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label_image = QtWidgets.QLabel(parent=self.groupBox)
        self.label_image.setText("")
        self.label_image.setObjectName("label_image")
        self.verticalLayout_2.addWidget(self.label_image)
        self.verticalLayout.addWidget(self.groupBox)

        self.retranslateUi(Form_Ejected_Object)
        QtCore.QMetaObject.connectSlotsByName(Form_Ejected_Object)

    def retranslateUi(self, Form_Ejected_Object):
        _translate = QtCore.QCoreApplication.translate
        Form_Ejected_Object.setWindowTitle(_translate("Form_Ejected_Object", "Form"))

Дело в том, что объект EjectedObject я добавляю в QGridLayout, который меняет размеры виджетов ему подвластных, и хочу, чтобы изображение внутри виджета подстраивалось под размер, который ему сейчас доступен, а вместо этого, при изменении размера изображения, снова вызывается resizeEvent
  • Вопрос задан
  • 281 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
kkmspb
@kkmspb
хобби C++, Qt, десктоп, микроконтроллеры STM32
В обработчике событий resizeEvent не надо устанавливать размеров виджетов.
Если хотите изменить размер виджета сделайте ему setMinimumSize или setFixedSize. Потом надо вызвать updateGeometry.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Uniscan Research Новосибирск
от 140 000 до 200 000 ₽
АО НПП «АМЭ» Санкт-Петербург
До 250 000 ₽
Базис-Центр Коломна
от 70 000 до 500 000 ₽