PyQt 예제 3.2.3

이번 글은 지난번 작성 했던 부분의 버그 수정에 관한 것이다. 특별한 내용은 없고 단지 버그가 있어서 글을 올린다.

수정된 내용은,
"이미지 확대 및 축소에서 소수점 절삭 및 오차로 인한 버그 수정"
"이미지 확대 및 축소의 같은 비율 유지 상태 저장 추가"
이다.

코드를 위부터 차례로 살펴보겠다.
#
        self.image = QImage(":kubuntuLogoIcon.png")
        self.imageLabel.setPixmap(QPixmap.fromImage(self.image))
        self.imageZoom = (100, 100)
        self.sameZoomCheckState = False
아래 2줄이 추가되었다. 현재 이미지 비율과 같은 비율 유지 상태 부분이다.

그리고 확대/축소 대화 상자를 여는 부분에서 수정된 곳이다.
#
        zoomDialog = QDialog(self)

        widthSpinBox = QSpinBox()
        widthSpinBox.setRange(0, 500) # 수정
        widthSpinBox.setSuffix(" %")
        heightSpinBox = QSpinBox()
        heightSpinBox.setRange(0, 500) # 수정
        heightSpinBox.setSuffix(" %")
        
        image = self.imageLabel.pixmap().toImage() # 확대 비율 계산 부분 삭제

        widthSpinBox.setValue(self.imageZoom[0])  # 추가
        heightSpinBox.setValue(self.imageZoom[1]) # 추가

        sameZoomCheckBox = QCheckBox("같은 비율 유지") # 추가
        sameZoomCheckBox.setChecked(self.sameZoomCheckState) # 추가

        def ValueSameSet(value):
            if sameZoomCheckBox.isChecked(): # 수정
                widthSpinBox.setValue(value)
                heightSpinBox.setValue(value)
        
        self.connect(widthSpinBox, SIGNAL("valueChanged(int)"),        
                        ValueSameSet)
        self.connect(heightSpinBox, SIGNAL("valueChanged(int)"),
                        ValueSameSet)
        self.connect(sameZoomCheckBox, SIGNAL("stateChanged(int)"), # 수정
                    lambda: ValueSameSet(widthSpinBox.value()))
        
        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | 
                                        QDialogButtonBox.Cancel)
        self.connect(buttonBox, SIGNAL("accepted()"), zoomDialog,
                        SLOT("accept()"))
        self.connect(buttonBox, SIGNAL("rejected()"), zoomDialog,
                        SLOT("reject()"))

        layout = QFormLayout()
        layout.addRow(QLabel("너비: "), widthSpinBox)
        layout.addRow(QLabel("높이: "), heightSpinBox)
        layout.addWidget(sameZoomCheckBox) # 수정
        layout.addWidget(buttonBox)

        zoomDialog.setLayout(layout)
        zoomDialog.setWindowTitle("이미지 확대/축소")

        if zoomDialog.exec_(): # 아래 내용 수정
            self.imageZoom = (widthSpinBox.value(), heightSpinBox.value())
            width = self.image.width() * self.imageZoom[0] // 100
            height = self.image.height() * self.imageZoom[1] // 100
            image = self.image.scaled(width, height)
            self.imageLabel.setPixmap(QPixmap.fromImage(image))
            self.sameZoomCheckState = sameZoomCheckBox.isChecked() # 추가

위에서 말한 대로, 이전 프로그램에서는 소수점 절삭 오차로 인해서 원래 확대/축소한 비율이 대화상자를 다시 열었을 때 다르게 나오는 버그가 있었다. 따라서 이들에 대한 값을 가지고 있도록 변경하였다.

댓글 없음:

댓글 쓰기