pyqt, pyside 앱에 이미지를 넣고 싶을 때는 QLabel 위젯을 활용할 수 있다. 이때 이미지를 넣을 때 이미지의 크기를 원래 크기와 다르게 해주려면 QPixmap 클래스의 scaled 메소드를 활용해야 한다. 이미지의 크기를 지정해줄 때는 이미지의 종횡비(aspect ratio)를 어떻게 설정할 것인가를 고려해야 한다. 종횡비는 이미지의 가로세로 비율이라고 생각하면 된다. 이미지의 경우 대체로 종횡비를 유지하는 것이 실제 비율을 해치지 않기 때문에 좋다.
QLabel 이미지 종횡비 설정법
만약 원래 이미지의 종횡비를 무시하고 지정하는 크기에 맞출 것이면 aspectMode를 Qt.IgnoreAspectRatio로 해주면 된다. 종횡비를 유지할 것이면 Qt.KeepAspectRatio로 설정하면 된다. 하지만 아래 보는 것처럼 여백이 생긴다. 그리고 Qt.KeepAspectRatioByExpanding으로 설정하면 종횡비를 유지하기 위해서 우리가 설정한 사이즈를 넘어간다. 프로그램이 의도하는 바에 따라서 적당한 flag를 선택하면 될 것이다.
전체 코드는 다음과 같다. 이미지가 200 x 200 의 크기로 표출되기 원하는 상황에서 종횡비 모드를 다양하게 바꿔본 것이다.
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QHBoxLayout, QWidget
from PySide6.QtGui import QPixmap
from PySide6.QtCore import QSize, Qt
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
pixmap = QPixmap("flower.jpg")
pixmap1 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.IgnoreAspectRatio)
pixmap2 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.KeepAspectRatio)
pixmap3 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.KeepAspectRatioByExpanding)
widget1 = QLabel("IgnoreAspectRatio")
widget2 = QLabel()
widget2.setPixmap(pixmap1)
widget2.setStyleSheet("border: 5px solid blue;")
widget3 = QLabel("KeepAspectRatio")
widget4 = QLabel()
widget4.setPixmap(pixmap2)
widget4.setStyleSheet("border: 5px solid blue;")
widget5 = QLabel("KeepAspectRatioByExpanding")
widget6 = QLabel()
widget6.setPixmap(pixmap3)
widget6.setStyleSheet("border: 5px solid blue;")
layout = QHBoxLayout()
layout.addWidget(widget1)
layout.addWidget(widget2)
layout.addWidget(widget3)
layout.addWidget(widget4)
layout.addWidget(widget5)
layout.addWidget(widget6)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
참고자료
[1] https://doc.qt.io/qtforpython-5/PySide2/QtGui/QPixmap.html
'Dev > python' 카테고리의 다른 글
[python+plotly] 그래프 x축, y축 값 범위 설정하기 (0) | 2022.03.18 |
---|---|
[python+plotly] px.scatter 플롯에 추세선 넣기 (0) | 2022.03.17 |
[pyqt5] 야구 중계에 스트라이크 존이 제공되지 않을 때 시청자를 위한 가이드 앱 (2) | 2022.03.16 |
[python] 파이썬스럽게 코딩하는 법, PEP8 정리 (4) | 2022.03.15 |
[pyside6] 위젯 내 글자 크기를 변경하고 싶을 때 (0) | 2022.02.26 |
[pyside6] QThreadPool을 이용해서 몇 개의 스레드가 활성화되어 있는지 확인하기 (1) | 2022.02.25 |
[flask+jinja2] 서버에서 받은 html 요소가 html 문서에서 제대로 표현되게 하려면? (0) | 2022.02.06 |
[flask+jinja2] break 사용하기 (2) | 2022.02.05 |