Dark theme for in Qt widgets?

China☆狼群 提交于 2019-11-30 00:48:30

No, but you may use my fairly comprehensive stylesheets that should look excellent on most platforms (it's inspired by KDE's Breeze Theme, which is a dark theme that is quite elegant). This was (hard) forked from the excellent QDarkStylesheet, which I felt had theme issues in numerous areas, so I modified it extensively for my own needs and added a light theme.

Simple Use

A sample of the theme is here. To use it in PyQt5, simply add the following lines to a project:

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

Dynamic Stylesheet Toggling

In response to a comment, the easiest way to adjust the stylesheet to use either the light or the dark stylesheet dynamically is to wrap it in a function. You may then use the function as a slot to a Qt signal (warning: I primarily develop using C++, so there may be small errors in my code for the signal/slot mechanism).

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

Now we can add generic application logic that can use this function in a signal/slot mechanism (using a lambda as a convenient wrapper, if needed, to provide the path to the stylesheet toggler):

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

This allows users to dynamically change the theme of an application developed with PyQt5 (or using analogous logic in C++, Qt5) to either a light or dark theme.

Disclaimer: Obviously I am the maintainer.

There's no dark theme built into Qt. But you can quite easily create one yourself with the following code:

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) 

The nice thing about this is that it introduces no external dependencies. If you're interested what the above changes look like, I created an example PyQt5 app with a dark theme. Here is a screenshot:

Founded in my bookmarks. I don't remember the original source.

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. it may be adjusted with QSS if necessary.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!