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를 자동으로 업데이트할 수도 있습니다.
'코딩취미 > Python' 카테고리의 다른 글
PySide6 QComboBox 포커스 아웃 이벤트 처리 및 선택 텍스트 확인 방법 (0) | 2025.02.21 |
---|---|
QFileDialog 특정폴더를 기본 경로 설정하기 (0) | 2025.02.21 |
파이썬에서 특정 클래스의 멤버 함수를 확인하는 방법 (0) | 2025.02.20 |
PySide6에서 QTreeView 스타일시트 선택자 정리 및 활용법 (0) | 2025.02.20 |
PySide6에서 화면 로딩 중 마우스 포인터 변경하는 방법 (0) | 2025.02.20 |