본문 바로가기
PyQt5_

Palettes

by 자동매매 2023. 3. 13.

Qt에서 사용자 인터페이스를 그리는 데 사용되는 색상 선택을 팔레트라고합니다.

응용 프로그램 수준과 위젯 별 팔레트는 모두 QPalette 개체를 통해 관리됩니다.
팔레트는 응용 프로그램 수준과 위젯 수준 모두에서 설정할 수 있으므로 전역 표준 팔레트를 설정하고 위젯별로 이를 재정의할 수 있습니다.
전역 팔레트는 일반적으로 Qt 테마 (일반적으로 OS에 따라 다름)에 의해 정의되지만이를 재정의하여 전체 앱의 모양을 변경할 수 있습니다. 활성 전역 팔레트는 QApplication.palette() 에서 액세스하거나 새로운 빈 QPalette 인스턴스를 만들어 액세스 할 수 있습니다.
 
 
 
예를 들면 다음과 같습니다.
 
from PyQt6.QtGui import QPalette 
palette  =  QPalette()

 

palette.setColor(role, color)

palette.setColor(QPalette.ColorRole.Window,   QColor(53,53,53)) 
palette.setColor(QPalette.ColorRole.WindowText,   Qt.GlobalColor.white)

 

 

Table 4. Main roles

Constant Value Description
QPalette.ColorRole.Window 10 Background color for windows.
QPalette.ColorRole.WindowText 0 Default text color for windows.
QPalette.ColorRole.Base 9 Background of text entry widgets, combobox drop down lists and toolbar handles. Usually white or light
QPalette.ColorRole.AlternateBa se 16 Second Base color used in striped (alternating) rows e.g.
QAbstractItemView.setAlternatingRowCo
lors()
QPalette.ColorRole.ToolTipBase 18 Background color for QToolTip and QWhatsThis hover indicators. Both tips use the Inactive group (see later) because they are not active windows.
QPalette.ColorRole.ToolTipText 19 Foreground color for QToolTip and QWhatsThis. Both tips use the Inactive group (see later) because they are not active windows.
QPalette.ColorRole.Placeholder Text 20 Color for placeholder text in widgets.
QPalette.ColorRole.Text 6 Text color for widgets colored with Base background. Must provide a good contrast with both Window and Base.
QPalette.ColorRole.Button 1 Default button background color. This can differ from Window but must provide good contrast with ButtonText.
QPalette.ColorRole.ButtonText 8 Text color used on buttons, must contrast with Button color.
QPalette.ColorRole.BrightText 7 Text color which is very different from WindowText, contrasts well with black. Used were other Text and WindowText colors would give poor contrast. Note: Not just used for text.

 

Table 5. 3D bevel roles 

Constant Value Description
QPalette.ColorRole.Light 2 Lighter than Button color.
QPalette.ColorRole.Midlight 3 Between Button and Light.
QPalette.ColorRole.Dark 4 Darker than Button.
QPalette.ColorRole.Mid 5 Between Button and Dark.
QPalette.ColorRole.Shadow 11 A very dark color. By default, the shadow color is Qt.GlobalColor.black.

 

Table 6. Highlighting & links

Constant Value Description
QPalette.ColorRole.Highlight 12 A color to indicate a selected item or the current item. By default, the highlight color is Qt.GlobalColor.darkBlue.
QPalette.ColorRole.Highlighted Text 13 A text color that contrasts with Highlight. By default, the highlighted text  Qt.GlobalColor.white.
QPalette.ColorRole.Link 14 A text color used for unvisited hyperlinks. By default, the link color is Qt.GlobalColor.blue.
QPalette.ColorRole.LinkVisited 15 A text color used for already visited hyperlinks. By default, the link-visited color is Qt.GlobalColor.magenta.

 

위젯이 active, inactive or disabled 상태일 때 변경되는 UI 부분의 경우 각 상태에 대해 색상을 설정해야 합니다.
 
palette.setColor(group, role, color)
Constant Value
QPalette.ColorGroup.Disabled 1
QPalette.ColorGroup.Active 0
QPalette.ColorGroup.Inactive 2
QPalette.ColorGroup.Normal  synonym for Active 0
palette.setColor(QPalette.ColorGroup.Disabled,   
                 QPalette.ColorRole.WindowText,  
                 Qt.GlobalColor.white)

 

팔레트가 정의되면 .setPalette() 를 사용하여 QApplication 객체에 설정하여 애플리케이션 또는 단일 위젯에 적용 할 수 있습니다.
예를 들어 다음 예제에서는 창 텍스트와 배경의 색상을 변경합니다(여기서는 텍스트가 QLabel을 사용하여 추가됨).

themes/palette_test.py

from PyQt6.QtWidgets import QApplication, QLabel
from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qt

import sys


app = QApplication(sys.argv)
palette = QPalette()
palette.setColor(QPalette.ColorRole.Window, QColor(0, 128, 255))
palette.setColor(QPalette.ColorRole.WindowText, Qt.GlobalColor.white)
app.setPalette(palette)

w = QLabel("Palette Test")
w.show()

app.exec()

 

일반적으로 사용자 설정을 재정의하지 않아야 하지만 밝은 UI가 사용자의 색 판단 기능을 방해하는 사진 뷰어 또는 비디오 편집기와 같은 특정 응용 프로그램 클래스에서는 의미가 있을 수 있습니다. 다음 앱 기본 항목은 Jürgen Skrotzky의 사용자 지정 팔레트를 사용하여 응용 프로그램에 전역 어두운 테마를 제공합니다.
 

themes/palette_dark.py

from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qt

import sys

darkPalette = QPalette()
darkPalette.setColor(QPalette.ColorRole.Window, QColor(53, 53, 53))
darkPalette.setColor(
    QPalette.ColorRole.WindowText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.WindowText,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.Base, QColor(42, 42, 42))
darkPalette.setColor(
    QPalette.ColorRole.AlternateBase, QColor(66, 66, 66)
)
darkPalette.setColor(
    QPalette.ColorRole.ToolTipBase, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorRole.ToolTipText, Qt.GlobalColor.white
)
darkPalette.setColor(QPalette.ColorRole.Text, Qt.GlobalColor.white)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.Text,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.Dark, QColor(35, 35, 35))
darkPalette.setColor(QPalette.ColorRole.Shadow, QColor(20, 20, 20))
darkPalette.setColor(QPalette.ColorRole.Button, QColor(53, 53, 53))
darkPalette.setColor(
    QPalette.ColorRole.ButtonText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.ButtonText,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.BrightText, Qt.GlobalColor.red)
darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.Highlight,
    QColor(80, 80, 80),
)
darkPalette.setColor(
    QPalette.ColorRole.HighlightedText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.HighlightedText,
    QColor(127, 127, 127),
)

app = QApplication(sys.argv)
app.setPalette(darkPalette)

w = QMainWindow()  # Replace with your QMainWindow instance.
w.show()

app.exec()

 

themes/palette_dark_widgets.py

from PyQt6.QtGui import QPalette, QColor
from PyQt6.QtCore import Qt

import sys


from PyQt6.QtWidgets import (
    QApplication,
    QMainWindow,
    QCheckBox,
    QComboBox,
    QDateEdit,
    QDateTimeEdit,
    QDial,
    QDoubleSpinBox,
    QFontComboBox,
    QLCDNumber,
    QLabel,
    QLineEdit,
    QProgressBar,
    QPushButton,
    QRadioButton,
    QSlider,
    QSpinBox,
    QTimeEdit,
    QWidget,  # <1>
    QVBoxLayout,  # <2>
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Widgets App")

        layout = QVBoxLayout()
        widgets = [
            QCheckBox,
            QComboBox,
            QDateEdit,
            QDateTimeEdit,
            QDial,
            QDoubleSpinBox,
            QFontComboBox,
            QLCDNumber,
            QLabel,
            QLineEdit,
            QProgressBar,
            QPushButton,
            QRadioButton,
            QSlider,
            QSpinBox,
            QTimeEdit,
        ]

        for w in widgets:
            widget = w(self)
            widget.setAutoFillBackground(True)
            layout.addWidget(widget)

        widget = QWidget()
        widget.setLayout(layout)

        # Set the central widget of the Window. Widget will expand
        # to take up all the space in the window by default.
        self.setCentralWidget(widget)


app = QApplication(sys.argv)
app.setStyle("Fusion")

darkPalette = app.palette()
darkPalette.setColor(QPalette.ColorRole.Window, QColor(53, 53, 53))
darkPalette.setColor(
    QPalette.ColorRole.WindowText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.WindowText,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.Base, QColor(42, 42, 42))
darkPalette.setColor(
    QPalette.ColorRole.AlternateBase, QColor(66, 66, 66)
)
darkPalette.setColor(
    QPalette.ColorRole.ToolTipBase, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorRole.ToolTipText, Qt.GlobalColor.white
)
darkPalette.setColor(QPalette.ColorRole.Text, Qt.GlobalColor.white)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.Text,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.Dark, QColor(35, 35, 35))
darkPalette.setColor(QPalette.ColorRole.Shadow, QColor(20, 20, 20))
darkPalette.setColor(QPalette.ColorRole.Button, QColor(53, 53, 53))
darkPalette.setColor(
    QPalette.ColorRole.ButtonText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.ButtonText,
    QColor(127, 127, 127),
)
darkPalette.setColor(QPalette.ColorRole.BrightText, Qt.GlobalColor.red)
darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.Highlight,
    QColor(80, 80, 80),
)
darkPalette.setColor(
    QPalette.ColorRole.HighlightedText, Qt.GlobalColor.white
)
darkPalette.setColor(
    QPalette.ColorGroup.Disabled,
    QPalette.ColorRole.HighlightedText,
    QColor(127, 127, 127),
)

w = MainWindow()  # Replace with your custom mainwindow.
w.show()

app.setPalette(darkPalette)


app.exec()

 

 

'PyQt5_' 카테고리의 다른 글

Qt Style Sheets (QSS)  (0) 2023.03.13
Icons  (0) 2023.03.13
Styles  (0) 2023.03.13
Qt Designer  (0) 2023.03.13
Events  (0) 2023.03.13

댓글