Source code for qdarktheme._main
from __future__ import annotations
import atexit
import os
import platform
import darkdetect
from qdarktheme._style_loader import load_palette, load_stylesheet
_listener = None
_proxy_style = None
def _apply_style(app, additional_qss: str | None, **kargs) -> None:
from qdarktheme._proxy_style import QDarkThemeStyle
stylesheet = load_stylesheet(**kargs)
if additional_qss is not None:
stylesheet += additional_qss
app.setStyleSheet(stylesheet)
app.setPalette(
load_palette(
kargs["theme"],
kargs["custom_colors"],
for_stylesheet=True,
default_theme=kargs["default_theme"],
)
)
global _proxy_style
if _proxy_style is None:
_proxy_style = QDarkThemeStyle()
app.setStyle(_proxy_style)
def _sync_theme_with_system(app, callback) -> None:
from qdarktheme._os_appearance import listener
global _listener
if _listener is not None:
_listener.sig_run.emit(True)
return
_listener = listener.OSThemeSwitchListener(callback)
if platform.system() == "Darwin":
app.installEventFilter(_listener)
else:
atexit.register(_listener.kill)
_listener.start()
[docs]def enable_hi_dpi() -> None:
"""Allow to HiDPI.
This function must be set before instantiation of QApplication..
For Qt6 bindings, HiDPI “just works” without using this function.
"""
from qdarktheme.qtpy.QtCore import Qt
from qdarktheme.qtpy.QtGui import QGuiApplication
if hasattr(Qt.ApplicationAttribute, "AA_UseHighDpiPixmaps"):
QGuiApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps) # type: ignore
if hasattr(Qt.ApplicationAttribute, "AA_EnableHighDpiScaling"):
QGuiApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling) # type: ignore
if hasattr(Qt, "HighDpiScaleFactorRoundingPolicy"):
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
QGuiApplication.setHighDpiScaleFactorRoundingPolicy(
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough
)
[docs]def stop_sync() -> None:
"""Stop sync with system theme."""
from qdarktheme.qtpy.QtCore import QCoreApplication
app = QCoreApplication.instance()
global _listener
if not app or not _listener:
return
_listener.sig_run.emit(False)
[docs]def setup_theme(
theme: str = "dark",
corner_shape: str = "rounded",
custom_colors: dict[str, str | dict[str, str]] | None = None,
additional_qss: str | None = None,
*,
default_theme: str = "dark",
) -> None:
"""Apply the theme which looks like flat design to the Qt App completely.
This function applies the complete style to your Qt application. If the argument theme is ``auto``,
try to listen to changes to the OS's theme and switch the application theme accordingly.
Args:
theme: The theme name. There are `dark`, `light` and `auto`.
If ``auto``, try to sync with your OS's theme and accent (accent is only on Mac).
If failed to detect OS's theme, use the default theme set in argument ``default_theme``.
When primary color(``primary``) or primary child colors
(such as ``primary>selection.background``) are set to custom_colors,
disable to sync with the accent.
corner_shape: The corner shape. There are `rounded` and `sharp` shape.
custom_colors: The custom color map. Overrides the default color for color id you set.
Also you can customize a specific theme only. See example 5.
additional_qss: Additional stylesheet text. You can add your original stylesheet text.
default_theme: The default theme name.
The theme set by this argument will be used when system theme detection fails.
Raises:
ValueError: If the argument is wrong.
KeyError: If the color id of custom_colors is wrong.
Returns:
The stylesheet string for the given arguments.
Examples:
Set stylesheet to your Qt application.
1. Setup style and sync to system theme ::
app = QApplication([])
qdarktheme.setup_theme()
2. Use Dark Theme ::
app = QApplication([])
qdarktheme.setup_theme("dark")
3. Sharp corner ::
# Change corner shape to sharp.
app = QApplication([])
qdarktheme.setup_theme(corner_shape="sharp")
4. Customize color ::
app = QApplication([])
qdarktheme.setup_theme(custom_colors={"primary": "#D0BCFF"})
5. Customize a specific theme only ::
app = QApplication([])
qdarktheme.setup_theme(
theme="auto",
custom_colors={
"[dark]": {
"primary": "#D0BCFF",
}
},
)
"""
from qdarktheme.qtpy.QtCore import QCoreApplication
app = QCoreApplication.instance()
if not app:
raise Exception("setup_theme() must be called after instantiation of QApplication.")
if theme != "auto":
stop_sync()
app.setProperty("_qdarktheme_use_setup_style", True)
def callback():
_apply_style(
app,
additional_qss,
theme=theme,
corner_shape=corner_shape,
custom_colors=custom_colors,
default_theme=default_theme,
)
callback()
if theme == "auto" and darkdetect.theme() is not None:
_sync_theme_with_system(app, callback)