soma0sd

코딩 & 과학 & 교육

PyQt5: 제목표시줄 스타일 바꾸기 1. GUI 구성

반응형

방법

모종의 편법입니다. FramelessWindowHint를 GUI의 플래그로 줘서 아예 프레임과 제목표시줄을 제거한 뒤 제목표시줄의 기능을 하는 위젯을 배치하는 방식입니다. 여기서는 배치만 다루고 다음에 제목표시줄로 작동하기 위한 기능들을 구현하도록 하겠습니다.

스크립트

"""윈도우 타이틀 꾸미기

https://soma0sd.tistory.com/
"""
import sys
from PyQt5 import QtWidgets, QtCore


class MainWindow(QtWidgets.QWidget):
    """메인 윈도우"""
    qss = """
        QWidget {
            color: #000000;
            background: #666;
        }
        QWidget#windowTitle {
            color: #FFFFFF;
            background: #333;
        }
        QWidget#windowTitle QLabel {
            color: #FFFFFF;
            background: #333;
        }
    """

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setStyleSheet(self.qss)

        # 레이아웃과 타이틀바 위젯 생성
        window_vbox = QtWidgets.QVBoxLayout(self)
        window_vbox.setContentsMargins(0, 0, 0, 0)
        titlebar_widget = QtWidgets.QWidget()
        titlebar_widget.setObjectName("windowTitle")
        title_hbox = QtWidgets.QHBoxLayout(titlebar_widget)
        content_vbox = QtWidgets.QVBoxLayout()
        content_vbox.setContentsMargins(3, 3, 3, 3)

        # 타이틀바와 컨텐츠 박스 안의 내용물을 생성
        title_label = QtWidgets.QLabel("윈도우 이름")
        content_textedit = QtWidgets.QTextEdit()

        # 각 항목을 레이아웃에 배치
        title_hbox.addWidget(title_label)
        content_vbox.addWidget(content_textedit)
        window_vbox.addWidget(titlebar_widget)
        window_vbox.addLayout(content_vbox)

if __name__ == "__main__":
    APP = QtWidgets.QApplication(sys.argv)
    WINDOW = MainWindow()
    WINDOW.show()
    APP.exec()

설명

Qt 스타일시트

MainWindow 클래스에 qss에는 Qt 스타일시트가 들어있습니다. HTML의 스타일시트 언어인 CSS와 유사한 문법을 가지고 있습니다. #문자로 고유한 요소의 스타일을 지정할 수 있는데, 해당 요소에 .setObjectName("이름")내부함수를 사용해 GUI 전체를 통틀어 유일한 이름을 지정한 후 사용할 수 있습니다.

윈도우 플래그

위젯에 setWindowFlags(Qt 힌트)FramelessWindowHint옵션을 줘서 프레임과 제목표시줄을 제거했습니다. 다양한 힌트를 사용하여 창의 스타일을 바꿀 수 있습니다.

레이아웃 구성

기능이 많고 디자인에 신경쓸수록 레이아웃 구조는 복잡해집니다. 요소간의 포함관계와 배치순서를 헷갈리지 않도록 별도로 정리하는 것을 권합니다.

반응형
태그:

댓글

End of content

No more pages to load