본문 바로가기
<개인공부> - IT/[Python]

Day 3. PyQt5 (QLabel)

by Aggies '19 2021. 2. 9.
반응형
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("My App")

        widget = QLabel("Hello")
        font = widget.font()
        font.setPointSize(30)
        widget.setFont(font)
        widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        
        self.setCentralWidget(widget)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

QLabel은 수정할 수 없고 글자로 구성된 위젯이다. 위의 코드를 수행하게 되면 Hello라는 글자를 볼 수 있다. 앞서서 설명한 코드와 거의 대동소이 하기때문에 이 부분에서는 Qt namespace를 이용하는 부분만 간략하게 정리해보고자 한다.

widget.setAlignment 설정라인을 보게되면 AlignHenter와 AlignVCenter를 OR 연산하는 것을 알 수 있다. 즉, 정렬의 방법에는 크게 수평, 수직정렬이 있음을 할 수 있다. 수평정렬에는 Left, Right, Center, 그리고 Justify가 존재한다.

 

Flag 정렬방식
Qt.AlignLeft 왼쪽 정렬
Qt.AlignRight 오른쪽 정렬
Qt.AlignHCenter 중앙 정렬
Qt.AlignJustify 1) -

책에서는 빨간색으로 highlighting된 Flag 역시 설명하고 있지만 PyQt5에서는 동작하지 않는다.

 

또한, 수직정렬 옵션에는 아래와 같이 세 가지 있다.

Flag 정렬방식
Qt.AlignTop 위쪽 정렬
Qt.AlignBottom 아래쪽 정렬
Qt.AlignVCenter 중앙 정렬

코드에서 보여진 것 처럼 각각의 Flag는 OR연산으로 조합이 가능하다. 조금더 자세하게 보면 살펴보면 flag는 non-overlapping bitmasks이다. 예를 들면, Qt.AlignLeft는 0b0001, Qt.AlignBotton은 0b0100의 값을 갖는다. 그래서 이 둘을 OR연산하면 0b0101이고 Bottom left 정렬로 해석할 수 있는 것이다. 물론, Qt.AlignCenter라는 하나의 flag로 수평, 수직을 동시에 정렬할 수 있다는 사실!

 

책에서도 weirdly라는 단어를 사용해서 표현했지만 image도 QLabel을 통해서 출력할 수 있다. 코드는 아래와 같으며 기본 옵션에 의해서 창의 크기를 변경하게 되면 이미지는 함께 확대/축소가 되지 않는다. 이 옵션을 변경하기 위해서는 아래와 같이 선언해주면 된다.

import sys

from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("My App")

        widget = QLabel()
        widget.setPixmap(QPixmap("test.jpg"))
        
        # 해당 라인이 없으면 이미지는 고정크기로 출력됨
        widget.setScaledContents(True)
        
        self.setCentralWidget(widget)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

1. Reference site: www.geeksforgeeks.org/qt-alignment-in-pyqt5/ (PyQt5에서 Flag 동작하지 않는 내용)

2. Reference book: "Create GUI Applications with Python & Qt5: The hands-on guide to making apps with Python"

반응형