it-swarm.com.de

Dunkles Thema für in Qt-Widgets?

Hintergrund

Ich baue eine PyQt5-Anwendung, für die ich ein dunkles Thema haben möchte. Zuvor habe ich mit der Android-Entwicklung gearbeitet, bei der es ein dunkles Thema gab, das ich für eine ganze Anwendung festlegen konnte

Frage

Gibt es ein dunkles Thema in Qt (das für alle Widgets in einer Anwendung gilt und das plattformübergreifend ist)?

5
sunyata

Nein, aber Sie können meine ziemlich umfassenden Stylesheets verwenden , die auf den meisten Plattformen hervorragend aussehen sollte (es ist inspiriert von KDEs Breeze-Theme, einem dunklen Thema, das ziemlich elegant ist). Dies war (hart) aus dem ausgezeichneten QDarkStylesheet , das meiner Meinung nach in zahlreichen Bereichen thematische Probleme hatte, gegabelt, also habe ich es stark an meine eigenen Bedürfnisse angepasst und ein leichtes Thema hinzugefügt.

Einfache Verwendung

Eine Probe des Themas ist hier. Um es in PyQt5 zu verwenden, fügen Sie einfach die folgenden Zeilen zu einem Projekt hinzu:

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

Dynamisches Stylesheet-Umschalten

Als Antwort auf einen Kommentar können Sie das Stylesheet für die dynamische Verwendung des hellen oder dunklen Stylesheets am einfachsten anpassen, indem Sie es in eine Funktion einschließen. Sie können die Funktion dann als Slot für ein Qt-Signal verwenden (Warnung: Ich entwickle hauptsächlich mit C++, daher kann es zu kleinen Fehlern in meinem Code für den Signal/Slot-Mechanismus kommen).

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())

Jetzt können wir eine generische Anwendungslogik hinzufügen, die diese Funktion in einem Signal/Slot-Mechanismus verwenden kann (bei Bedarf kann ein Lambda als praktischer Wrapper verwendet werden, um den Pfad zum Stylesheet-Toggle anzugeben):

# 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_())

Auf diese Weise können Benutzer das Thema einer mit PyQt5 entwickelten Anwendung (oder die Verwendung analoger Logik in C++, Qt5) dynamisch in ein helles oder dunkles Thema ändern.

Disclaimer: Natürlich bin ich der Maintainer.

11

In Qt ist kein dunkles Thema integriert. Mit dem folgenden Code können Sie jedoch ganz einfach selbst einen erstellen:

from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPalette

app = QApplication([])
# Force the style to be the same on all OSs:
app.setStyle("Fusion")

# Now use a palette to switch to dark colors:
palette = QPalette()
palette.setColor(QPalette.Window, QColor(53, 53, 53))
palette.setColor(QPalette.WindowText, Qt.white)
palette.setColor(QPalette.Base, QColor(25, 25, 25))
palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
palette.setColor(QPalette.ToolTipBase, Qt.white)
palette.setColor(QPalette.ToolTipText, Qt.white)
palette.setColor(QPalette.Text, Qt.white)
palette.setColor(QPalette.Button, QColor(53, 53, 53))
palette.setColor(QPalette.ButtonText, Qt.white)
palette.setColor(QPalette.BrightText, Qt.red)
palette.setColor(QPalette.Link, QColor(42, 130, 218))
palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
palette.setColor(QPalette.HighlightedText, Qt.black)
app.setPalette(palette)

Das Schöne daran ist, dass es keine externen Abhängigkeiten gibt. Wenn Sie interessiert sind, wie die obigen Änderungen aussehen, habe ich ein Beispiel erstellt PyQt5-App mit einem dunklen Thema . Hier ist ein Screenshot:

Qt dark theme

4

In meinen Lesezeichen gefunden. Ich erinnere mich nicht an die ursprüngliche Quelle.

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. es kann bei Bedarf mit QSS eingestellt werden.

0
Dmitry Sazonov