@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
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 1
kkmspb
@kkmspb
хобби C++, Qt, десктоп, микроконтроллеры STM32
В обработчике событий resizeEvent не надо устанавливать размеров виджетов.
Если хотите изменить размер виджета сделайте ему setMinimumSize или setFixedSize. Потом надо вызвать updateGeometry.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы