web-dev-qa-db-fra.com

Thème sombre pour les widgets Qt?

Contexte

Je construis une application PyQt5, pour laquelle j'aimerais avoir un thème sombre. Auparavant, je travaillais avec le développement Android où il y avait un thème sombre que je pouvais définir pour une application complète.

Question

Existe-t-il un thème sombre intégré à Qt (qui s'applique à tous les widgets d'une application et qui est multi-plateforme)?

5
sunyata

Non, mais vous pouvez utiliser des styles assez complets stylesheets qui devraient être excellents sur la plupart des plates-formes (inspiré du thème Breeze de KDE, un thème sombre très élégant). Cela était (difficile) tiré de l'excellent QDarkStylesheet , qui, à mon avis, comportait des numéros thématiques dans de nombreux domaines. Je l'ai donc largement modifié pour mes propres besoins et ajouté un thème clair.

Utilisation simple

Un échantillon du thème est ici. Pour l'utiliser dans PyQt5, ajoutez simplement les lignes suivantes à un projet:

import sys
from PyQt5.QtCore import QFile, QTextStream
from PyQt5.QtWidgets import QApplication
import breeze_resources

app = QApplication(sys.argv)
file = QFile(":/dark.qss")
file.open(QFile.ReadOnly | QFile.Text)
stream = QTextStream(file)
app.setStyleSheet(stream.readAll())

 enter image description here

Basculement dynamique de la feuille de style

En réponse à un commentaire, le moyen le plus simple d'ajuster la feuille de style de manière dynamique ou claire est de l'envelopper dans une fonction. Vous pouvez ensuite utiliser la fonction en tant qu'emplacement pour un signal Qt (avertissement: je développe principalement en C++, de sorte que de petites erreurs peuvent survenir dans mon code pour le mécanisme signal/emplacement).

def toggle_stylesheet(path):
    '''
    Toggle the stylesheet to use the desired path in the Qt resource
    system (prefixed by `:/`) or generically (a path to a file on
    system).

    :path:      A full path to a resource or file on system
    '''

    # get the QApplication instance,  or crash if not set
    app = QApplication.instance()
    if app is None:
        raise RuntimeError("No Qt Application found.")

    file = QFile(path)
    file.open(QFile.ReadOnly | QFile.Text)
    stream = QTextStream(file)
    app.setStyleSheet(stream.readAll())

Nous pouvons maintenant ajouter une logique d'application générique pouvant utiliser cette fonction dans un mécanisme signal/emplacement (en utilisant un lambda comme wrapper commode, si nécessaire, pour fournir le chemin d'accès au bascule de la feuille de style):

# add logic for setting up application
app = QApplication(sys.argv)
# more logic for creating top-level widgets, application logic ...

parent = ...
light_btn = QPushButton("Toggle light.", parent)
light_btn.clicked.connect(lambda: toggle_stylesheet(":/light.qss"))

dark_btn = QPushButton("Toggle dark.", parent)
dark_btn.clicked.connect(lambda: toggle_stylesheet(":/dark.qss"))

# add to the layout, do other stuff
# ...

# end the Qt application
sys.exit(app.exec_())

Cela permet aux utilisateurs de changer dynamiquement le thème d'une application développée avec PyQt5 (ou en utilisant une logique analogue en C++, Qt5) en un thème clair ou sombre.

Avertissement: Je suis évidemment le responsable.

11
Alexander Huszagh

Fondée dans mes marque-pages. Je ne me souviens pas de la source originale.

QApplication::setStyle(QStyleFactory::create("Fusion"));
QPalette p;
p = qApp->palette();
p.setColor(QPalette::Window, QColor(53,53,53));
p.setColor(QPalette::Button, QColor(53,53,53));
p.setColor(QPalette::Highlight, QColor(142,45,197));
p.setColor(QPalette::ButtonText, QColor(255,255,255));
qApp->setPalette(p);

P.S. il peut être ajusté avec QSS si nécessaire.

0
Dmitry Sazonov