본문 바로가기
파이썬-PySide6(PyQt6)

[PySide6]QLabel 사용방법 2/3

by Martinii의 회사원코딩 2021. 7. 11.

지난 시간에 이어, QLabel 관련한 내용을 이어서 설명드리겠습니다.

복습 겸 지난 포스팅을 읽고 오시거나, 아래의 전체코드라도 한 번은 정독하고 포스팅을 읽어주셨으면 합니다.

import sys
 
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow
 
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
 
        self.setWindowTitle("QLabel 예제")
 
        widget = QLabel("<=><= >= == != Hello World!")
 
        font = widget.font()
        font.setPointSize(30)
        font.setBold(True)
        font.setItalic(False)
        font.setFamily("D2Coding Ligature")
 
        widget.setFont(font)
        widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
 
        self.setCentralWidget(widget)
 
 
app = QApplication(sys.argv)
 
window = MainWindow()
window.show()
 
app.exec()  # 버전 6.1.2 이상 버전부터는 기존의 exec_() 대신 exec()를 사용할 것을 권함

이번 시간에는, (비단 QLabel에 국한한 내용은 아닌) 폰트와 플래그, 그리고 부록으로 QLabel에 이미지를 붙이는 메서드인 setPixmap에 대해 설명드리고 마치겠습니다.


 

[15] font = widget.font()

어느 정도 코딩에는 익숙한데 Qt 인터페이스에 익숙치 않은 분들은, 15번 라인의 의미를 이렇게 해석할 수도 있을 것 같습니다.

'QLabel 위젯에서 font 객체를 생성했으니까, font에서 설정값을 바꾸면 위젯의 폰트도 즉시 바뀌겠구나?'

맞는 말 같지만 완전히 다릅틀립니다. 아래처럼 생각하세요.

'위젯의 현재 폰트 설정값을 font(==widget.font()) 객체에다 복사했으니,
font객체의 설정값을 바꿔도 widget의 값이 바뀌지는 않겠구나?'

실제로 그렇습니다. font.setBold(True)를 하든, font.setPointSize(30)을 하든 위젯의 값이 바로 바뀌지는 않습니다.

그럼 QLabel 위젯의 언제 바뀌냐고요? 바로, 21번 라인

[21] widget.setFont(font)

를 실행해서 font의 설정값을 widget에 되돌려줄 때입니다. 단, Qt의 프로세스가 모두 이런 식으로 값을 먼저 바꾼 후 일종의 커밋(?)을 해야 적용되는 방식은 아닙니다. (레퍼런스나 API문서를 자주 참고해야 하는 이유도 이런 데 있습니다.)


[22] widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

혹자는 막연하게나마 파이프연산자(|)가 OR연산을 위한 기호(?)라고 알고 계실텐데요. 이 부분을 조금만 더 정확히 언급해 드리기 위해 몇 가지를 먼저 설명드리려고 합니다.

우선 3번라인,

[3] from PySide6.QtCore import Qt

여기서 임포트된 Qt는 그 네임스페이스 안에 온갖 설정을 위한 상수값들(constants)이 모여 있습니다. Qt에서는 이들을 가리켜 "플래그"라고 부르고, 위젯이나 위젯 내의 텍스트, 서브위젯의 정렬(Alignment)을 설정하는 플래그를 포함한 온갖 설정값들이 모두 이 안에 포함되어 있습니다. 이들 상수값은 윈도우API나 엑셀VBA의 constants와 동일하게 모두 정수로 이뤄져 있으며, 사용방법도 유사합니다. 단, 중복되는 값이 많이 있습니다. 아래 코드를 보시면 어떤 느낌인지 아실 겁니다.

AlignLeft와 DecorationRole 둘 다 값이 정수1과 같지만, 서로 동일한 타입은 아니다.

너무 TMI스럽지만, 혹시 이런 거 궁금하신 분 계세요?

Qt 상수값들 중에 겹치는게 많다고?
그렇다면 과연 상수값이 1과 같은 Qt플래그는 몇 개나 될까?

파이썬 문법실력도 키워볼 겸 이런 것 자주 고민해봐도 좋다고 생각합니다.

저는 아래와 같은 방법으로 알아보았습니다. 혹시 다른 방법으로 풀어 보신 분 계신가요?^^;

list_value_of_1 = []
for i in Qt.__dict__.keys():
    try:
        if eval(f"int(Qt.{i})") == 1:
            list_value_of_1.append(i)
        else:
            pass
    except:
        pass

print(len(list_value_of_1))  # == 77

Qt플래그 중 그 값이 1인 클래스가 77개나 되는군요ㄷㄷㄷ

 

오늘은 별로 영양가가 없는 쉬어가는 코너 같은 포스팅이 돼버렸네요..

내일 본격적으로 QLabel을 마치고, QCheckBox로 넘어가겠습니다. 새벽 두 시가 넘어버려서 이제 자야겠습니다.

 

긴 글 읽어주셔서 감사합니다.

행복한 하루 되세요^^

 


일상 이야기

요즘은 앤드류응 교수님의 코세라 머신러닝 강의를 재수강하고 있습니다.

지금 2주차인데요. 리그레션(경사하강법과 normal equation)의 설명을 마치고,

드디어 octave로 실습과제를 작성해서 제출해야 하는 시점에 (다시) 도착했습니다.

아니나다를까 이번에도 한글자막은 여기까지고, 2주차 말미부터는 자막이 나오지 않더군요.

깊은 빡침과 함께, 이번 차수에도 이 명강의를 완강하지 못하게 되는 건가 싶은 걱정이 생겨

나름 머신러닝의 고전 및 명저라는 책들을 검색해보고 있습니다.

 

1.

역시 세계적으로 가장 유명한(그리고 가장 어려운) 책은 이것이네요. 악명이 자자합니다. 저는 비추.

 

2.

1번 책을 이해하게 하기 위해 저술했다는 숨겨진 명저, 사실 2017 세종도서 선정작이기도 합니다.

오늘 오전부터 읽고 있는 책인데, 코세라 머신러닝과 정반대에 가까운 과정으로 설명해주는 게

신기하기도 하고 재미있기도 합니다. 파이썬 라이브러리로 단번에 해석하지 않고(오라일리의 도롱뇽책과 비교됨)

직접 손으로 푸는 과정과 증명이 많고, 식을 이해시키기 위해 전개하거나 상세히 분해하는 과정이

정통 "떠먹여주기"식입니다. (오죽하면 표준편차의 불편추정량을 알려주기 위해 카이제곱분포까지 언급...?=ㅅ=)

모든 풀이와 시각화는 파이썬으로 코딩해서 깃헙에 업로드되어 있습니다.

일본인인 데다 이론물리학자 출신이어서 그런지 설명이 굉장히 꼼꼼합니다. 

 

3.

표지 때문에 사게 된다는 이 책. 관심있는 모두가 머신러닝을 이해할 수 있게 하기 위해 어느 학년 과정까지 되돌아가야 할까 오랜 고민을 하신 것 같습니다. 이 책은 "머신러닝" 책이라기보다는 정말 "기초수학서적"에 가깝습니다. 최소한 복잡한 수식에 대한 거부감은 이 책을 통해 훅 줄어드는 것 같습니다. TMI로, 표지일러스트는 혼공파의 윤인성 저자님 작품입니다. 이 분 유튜브 채널에도 일러스트 작업 과정을 직접 올려 두셨습니다. 

 

 


donaricano-btn

댓글1

  • DBnoid 2021.07.29 18:35

    PyQt를 살짝맛보고 라이센스 이슈가 있는듯 하여 PySide6를 검색하다 방문하고 PySide 글을 7/9올려주신것 까지 다 봤네요... 참 디테일하십니다.
    PySide를 이용해서 처리시 응답없음을 많이 경험했는데 PySide강의에도 꼭 필요할 거 같습니다.
    잘 풀어 봐 주시길 바랍니다. 응원하고 기대하겠습니다^^
    답글