본문 바로가기
코딩취미/Python

PySide6에서 다크 모드 시 RibbonBar 텍스트 색상 설정하기

by 브링블링 2025. 2. 21.
반응형

PySide6에서 다크 모드 시 RibbonBar 텍스트 색상 설정하기

📝 소개

PySide6을 사용하여 GUI 애플리케이션을 개발할 때, 윈도우의 다크 모드를 감지하고 UI 스타일을 적절히 변경해야 하는 경우가 있습니다. 특히 **RibbonBar(리본 바)**에서 표시되는 텍스트 색상은 다크 모드에서는 잘 보이지 않을 수 있기 때문에, 이를 명확하게 표시하려면 폰트 색상을 수동으로 설정해야 합니다. 이번 포스팅에서는 PySide6에서 다크 모드 감지 후 RibbonBar의 텍스트 색상을 변경하는 방법과,패널 텍스트 및 섹션 텍스트의 색상을 설정하는 방법을 정립합니다.
또한, QFont(AuplApplication.standardFont, self.pinFontSize)에서 폰트 색상을 변경하는 코드도 추가합니다.


🎯 목표

  • PySide6에서 윈도우 다크 모드를 감지하는 방법을 배운다.
  • RibbonBar의 기본 텍스트 색상을 변경하는 방법을 익힌다.
  • 리본바의 패널 텍스트와 섹션 텍스트 색상을 설정하는 코드를 적용한다.
  • 폰트(QFont)의 색상을 수동으로 변경하는 방법을 이해한다.

📌 다크 모드 감지 및 RibbonBar 텍스트 색상 변경 방법

1️⃣ 윈도우 다크 모드 감지하기

PySide6에서는 QPalette를 사용하여 현재 테마를 감지할 수 있습니다. 다크 모드 여부를 확인하려면 다음과 같은 방법을 사용할 수 있습니다.

def is_dark_mode():
    palette = QApplication.palette()
    bg_color = palette.color(palette.Window)
    return bg_color.value() < 128  # RGB 값이 낮으면 다크 모드

2️⃣ RibbonBar의 텍스트 색상 설정

RibbonBar의 기본 텍스트 색상은 시스템 테마에 따라 다를 수 있습니다. 다크 모드에서는 밝은 색 (#FFFFFF), 라이트 모드에서는 어두운 색 (#000000)으로 설정하는 것이 일반적입니다.

def set_ribbon_text_color(ribbon_bar, dark_mode):
    text_color = "#FFFFFF" if dark_mode else "#000000"
    ribbon_bar.setStyleSheet(f"color: {text_color};")

3️⃣ 리본바의 패널 텍스트 및 섹션 텍스트 색상 설정

리본바의 패널 및 섹션 내부 텍스트 색상도 명확하게 설정해야 합니다.

def set_ribbon_panel_section_text(ribbon_bar, dark_mode):
    text_color = "#FFFFFF" if dark_mode else "#000000"
    ribbon_bar.setStyleSheet(f"""
        QTabBar::tab {{
            color: {text_color};
        }}
        QLabel {{
            color: {text_color};
        }}
    """)

4️⃣ QFont(AuplApplication.standardFont, self.pinFontSize)의 색상 설정

일반적으로 QFont 자체는 색상을 설정할 수 없지만, QPalette와 함께 사용하여 텍스트 색상을 변경할 수 있습니다.

def set_font_color(widget, dark_mode):
    text_color = "#FFFFFF" if dark_mode else "#000000"
    palette = widget.palette()
    palette.setColor(widget.foregroundRole(), text_color)
    widget.setPalette(palette)
반응형

📌 예제 코드: 다크 모드에서 RibbonBar 텍스트 색상 변경하기

아래는 PySide6에서 윈도우 다크 모드를 감지한 후 RibbonBar의 텍스트 색상을 변경하는 코드입니다.

from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QTabWidget
from PySide6.QtGui import QFont, QPalette
from PySide6.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("RibbonBar Dark Mode Example")
        self.resize(600, 400)

        # 리본바 (QTabWidget으로 가정)
        self.ribbon_bar = QTabWidget(self)
        self.setCentralWidget(self.ribbon_bar)

        # 다크 모드 확인
        dark_mode = self.is_dark_mode()

        # 리본바 텍스트 색상 설정
        self.set_ribbon_text_color(dark_mode)

        # 패널 및 섹션 텍스트 색상 설정
        self.set_ribbon_panel_section_text(dark_mode)

        # 폰트 색상 변경
        self.label = QLabel("RibbonBar Example")
        self.label.setFont(QFont("Arial", 12))
        self.set_font_color(self.label, dark_mode)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def is_dark_mode(self):
        """다크 모드 여부 확인"""
        palette = QApplication.palette()
        bg_color = palette.color(QPalette.Window)
        return bg_color.value() < 128  # RGB 값이 낮으면 다크 모드

    def set_ribbon_text_color(self, dark_mode):
        """RibbonBar의 기본 텍스트 색상 설정"""
        text_color = "#FFFFFF" if dark_mode else "#000000"
        self.ribbon_bar.setStyleSheet(f"color: {text_color};")

    def set_ribbon_panel_section_text(self, dark_mode):
        """리본바 패널 및 섹션 텍스트 색상 설정"""
        text_color = "#FFFFFF" if dark_mode else "#000000"
        self.ribbon_bar.setStyleSheet(f"""
            QTabBar::tab {{
                color: {text_color};
            }}
            QLabel {{
                color: {text_color};
            }}
        """)

    def set_font_color(self, widget, dark_mode):
        """폰트 색상 변경"""
        text_color = Qt.white if dark_mode else Qt.black
        palette = widget.palette()
        palette.setColor(widget.foregroundRole(), text_color)
        widget.setPalette(palette)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

📌 코드 설명

기능 설명
is_dark_mode() 현재 운영 체제가 다크 모드인지 확인
set_ribbon_text_color() 리본바의 기본 텍스트 색상을 설정
set_ribbon_panel_section_text() 리본바 패널 및 섹션 내부 텍스트 색상을 설정
set_font_color() 특정 위젯의 폰트 색상을 설정
QTabWidget RibbonBar를 대체하는 역할 (실제 RibbonBar는 PySide6에 기본 제공되지 않음)

📌 실행 결과

운영 체제가 다크 모드일 때 RibbonBar 텍스트가 흰색으로 표시됩니다.
운영 체제가 라이트 모드일 때 RibbonBar 텍스트가 검은색으로 표시됩니다.
패널 및 섹션 내부 텍스트 색상도 다크/라이트 모드에 맞게 자동 변경됩니다.
라벨(QLabel)의 폰트 색상도 다크 모드에 맞게 변경됩니다.


📌 추가 개선 가능 사항

  • RibbonBar를 QTabWidget 대신 구현
    • PySide6에서는 기본적으로 RibbonBar를 제공하지 않으므로, 실제 Ribbon UI를 원하면 QtitanRibbon 등의 외부 라이브러리를 사용할 수도 있습니다.
  • 시스템 설정을 실시간으로 감지하여 반영
    • 현재 코드는 다크 모드를 실행 시점에만 확인하지만, 설정이 변경되었을 때 UI를 자동으로 업데이트할 수도 있습니다.
반응형