Home > PyQt5, python > PyQt5: QPalette

PyQt5: QPalette

25 giugno 2019

Torna all’indice degli appunti

QPalette

In Qt, tutti i widgets contengono un palette che li disegna.
La classe QPalette contiene i 3 gruppi di colori che rappresentano i 3 stati di un widget: Active, Inactive e Disabled:

Active: gruppo di colori per la finestra che detiene il Focus;
Inactive: le altre finestre (che non hanno il Focus);
Disabled: gruppo di colori utilizzato per i widget (non le window) che sono disabilitati;

Sia le window attive, sia le inattive, possono contenere Disabled widgets.

Per ottenere un color/brush di un determinato ColorGroup, di un determinato ColorRole, si utilizza il metodo color(ColorGroup, ColorRole) o i metodi scorciatoia dell’oggetto QPalette: ad esempio window(), windowText(), base().

>>> from PyQt5.QtWidgets import QApplication, QPushButton
>>> from PyQt5.QtGui import QPalette
>>> app = QApplication([])
>>> button = QPushButton("OK")
>>> palette = button.palette()
>>> palette.brush(QPalette.Active, QPalette.Text) == palette.text()
True
>>> palette.text().color().name()
'#000000'
>>> palette.base().color().name()
'#ffffff'

Per settare un color/brush invece, si utilizza il metodo setColor(ColorGroup, ColorRole, QColor) o setBrush(ColorGroup, ColorRole, QBrush).
Se volessimo ad esempio settare il colore del testo di un bottone nel suo stato Active:

>>> from PyQt5.QtGui import QColor
>>> color = QColor(130, 111, 132)
>>> palette.setColor(QPalette.Normal, text_role, color)
>>> button.setPalette(palette)
>>> new_color = palette.color(QPalette.Normal, button.foregroundRole())
>>> new_color.getRgb()
(130, 111, 132, 255)

ColorRole

Gli enum ColorRole che definiscono i differenti colori utilizzati nella GUI, sono:

CostanteValoreDescrizione
QPalette.Window10Colore di background generico
QPalette.BackgroundWindowObsoleto, usare Window
QPalette.WindowText0Colore di Foreground generico
QPalette.ForegroundWindowTextObsoleto. Usare WindowText
QPalette.Base9Usato principalmente per il background color dei textentry widgets, ma anche come background dei combobox drop down lists. Generalmente bianco o di colore chiaro
QPalette.AlternateBase16background alternativo in views con righe di colore alternato(QAbstractItemView.setAlternatingRowColors())
QPalette.ToolTipBase18background per QToolTip e QWhatsThis. I Tool tips usano il color group Inactive di QPalette, perchè non sono active windows
QPalette.ToolTipText19foreground color per QToolTip e QWhatsThis. I Tool tips usano il color group Inactive di QPalette, perchè non sono active windows
QPalette.PlaceholderText20colore per il placeholder dei widget in inserimento testo
QPalette.Text6Il colore di foreground usato con Base
QPalette.Button1Il colore di background dei bottoni
QPalette.ButtonText8Il colore di foreground usato nei bottoni
QPalette.BrightText7Il colore del testo quando è necessario un contrasto elevato

ColorGroup

Gli enum ColorGroup che definiscono i differenti stati di un widget, sono:

Costante Valore Descrizione
QPalette.Disabled 1 stato disabled
QPalette.Active 0 stato Active
QPalette.Inactive 2 stato Inactive
QPalette.Normal Active sinonimo di Active

Per sapere quale ColorGroup è settato per l’oggetto QPalette, si utilizza il metodo currentColorGroup() che restituisce l’enum corrispondente.
Di default, il color group è Active/Normal:

>>> from PyQt5.QtWidgets import QApplication, QPushButton
>>> from PyQt5.QtGui import QPalette
>>> app = QApplication([])
>>> button = QPushButton()
>>> palette = button.palette()
>>> palette.currentColorGroup()
0

Per settare un color group differente, si utilizza il metodo setCurrentColorGroup(ColorGroup), dove ColorGroup è uno dei 4 enum della tabella precedente:

>>> palette.setCurrentColorGroup(QPalette.Disabled)
>>> palette.currentColorGroup()
1

Come anticipato, è possibile ottenere il color/brush di un determinato role, o con il metodo color(ColorGroup, role), o con i metodi specifici per il ColorGroup corrente, che sono:

base(): ritorna l’oggetto brush responsabile del base (background);

>>> palette.base()
<PyQt5.QtGui.QBrush object at 0x035FCD70>
>>> palette.base().texture()
<PyQt5.QtGui.QPixmap object at 0x035FCC70>
>>> palette.base().color()
<PyQt5.QtGui.QColor object at 0x035FCD30>
>>> palette.base().color().value()
240

alternateBase(): ritorna il brush dell’alternate base (background) per il ColorGroup corrente;
brightText(): ritorna il brush del bright text (foreground) per il ColorGroup corrente;
text(): ritorna l’oggetto brush del text (foreground) del ColorGroup corrente;
button(): ritorna l’oggetto brush responsabile del button del ColorGroup corrente;
buttonText(): ritorna l’oggetto brush responsabile del testo del button (foreground) del ColorGroup corrente;
dark(): ritorna il dark brush del ColorGroup corrente;
light(): ritorna il light brush del ColorGroup corrente;
highlight(): ritorna l’highlight brush del ColorGroup corrente;
highlightedText(): ritorna il brush di testi evidenziati del ColorGroup corrente;
link(): ritorna il brush per i link non visitati del ColorGroup corrente;
linkVisited(): ritorna il brush per i link visitati del ColorGroup corrente;
mid(): ritorna il mid brush del ColorGroup corrente;
placeHolderText(): ritorna il brush del place holder text (suggerimento) del ColorGroup corrente;
shadow(): ritorna il brush dell’ombra del ColorGroup corrente;
toolTipBase(): ritorna il brush del background del tooltip del ColorGroup corrente;
toolTipText(): ritorna il brush del testo del tooltip del ColorGroup corrente;
window(): ritorna il brush del backgorund generale della window del ColorGroup corrente;
windowText(): ritorna il brush del foreground generale della window del ColorGroup corrente;

Ecco un esempio di codice per la modifica del testo e del colore del bottone.

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QPushButton
from PyQt5.QtGui import QColor, QPalette
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QButton Example")
        self.central_widget = FormWidget(self) 
        self.setCentralWidget(self.central_widget)
        self.resize(200, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        t_color = QColor(190, 49, 54)
        b_color = QColor(90, 192, 54)
        button = QPushButton("OK", minimumHeight=48)
        palette = button.palette()
        text = button.foregroundRole()
        base = button.backgroundRole()
        button.setAutoFillBackground(True)
        palette.setColor(QPalette.Active, text, t_color)
        palette.setColor(QPalette.Active, base, b_color)
        button.setPalette(palette)
        layout.addWidget(button, 0)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

BACKGROUND BUTTON

Se il colore del background del bottone cambia solo nella cornice, bisogna utilizzare il metodo setStyleSheet(string) del widget.
E’ possibile infatti modificare l’aspetto del widget, inserendo una stringa con tutti i parametri, come fosse CSS.

Esempio:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QPushButton
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QButton Example")
        self.central_widget = FormWidget(self) 
        self.setCentralWidget(self.central_widget)
        self.resize(200, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        button = QPushButton("OK", objectName="custombutton", minimumHeight=48)
        button.setStyleSheet(StyleSheet)
        layout.addWidget(button, 0)


StyleSheet = """
#custombutton {
    border: 2px solid #666;
    max-height: 48px;
    border-top-right-radius:   20px;   
    border-bottom-left-radius: 20px;   
    background-color: #ff9800;
}
#custombutton:hover {
    background-color: #ffb74d;
}
#custombutton:pressed {
    background-color: #ffe0b2;
}
"""


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.