PyQt5: QPalette
Torna all’indice degli appunti
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:
Costante | Valore | Descrizione |
---|---|---|
QPalette.Window | 10 | Colore di background generico |
QPalette.Background | Window | Obsoleto, usare Window |
QPalette.WindowText | 0 | Colore di Foreground generico |
QPalette.Foreground | WindowText | Obsoleto. Usare WindowText |
QPalette.Base | 9 | Usato principalmente per il background color dei textentry widgets, ma anche come background dei combobox drop down lists. Generalmente bianco o di colore chiaro |
QPalette.AlternateBase | 16 | background alternativo in views con righe di colore alternato(QAbstractItemView.setAlternatingRowColors()) |
QPalette.ToolTipBase | 18 | background per QToolTip e QWhatsThis. I Tool tips usano il color group Inactive di QPalette, perchè non sono active windows |
QPalette.ToolTipText | 19 | foreground color per QToolTip e QWhatsThis. I Tool tips usano il color group Inactive di QPalette, perchè non sono active windows |
QPalette.PlaceholderText | 20 | colore per il placeholder dei widget in inserimento testo |
QPalette.Text | 6 | Il colore di foreground usato con Base |
QPalette.Button | 1 | Il colore di background dei bottoni |
QPalette.ButtonText | 8 | Il colore di foreground usato nei bottoni |
QPalette.BrightText | 7 | Il 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_())
Commenti recenti