Skip to main content

PySide6 bindings for Qlementine, a modern QStyle for desktop Qt6 applications

Project description

PyQt6/PySide6-Qlementine

PyQt6/PySide6 Bindings for (the amazing) Qlementine

Modern QStyle for desktop Qt6 applications... ready for Python!

Installation

pip install PyQt6-Qlementine
# or 
pip install PySide6-Qlementine

Usage

# or PySide6 & PySide6Qlementine
from PyQt6.QtWidgets import QApplication
from PyQt6.QtCore import QJsonDocument
from PyQt6Qlementine import QlementineStyle, Theme

app = QApplication([])

# Apply Qlementine as the application style
# (this alone will apply the default Qlementine theme, which is lovely)
style = QlementineStyle(app)
app.setStyle(style)

# Define a custom theme, for all keys, see:
# https://oclero.github.io/qlementine/theme/#full-example
theme_dict = {
    "meta": {"name": "Custom", "author": "Your Name", "version": "1.0"},
    "primaryColor": "#ff00ff",
    "backgroundColorMain1": "#1a1a2e",
    "backgroundColorMain2": "#1a1a2e",
}

theme = Theme.fromJsonDoc(QJsonDocument.fromVariant(theme_dict))
style.setTheme(theme)

See C++ documentation for more information.

See also examples in this repo.

The autogenerated type stubs are also useful for understanding the API.

Why QStyle over QSS?

If you're coming from the Python Qt ecosystem, you're likely used to theming via Qt Style Sheets (QSS) — every major Python theming library (QDarkStyleSheet, qt-material, BreezeStyleSheets, etc.) relies on them.

QSS is easy to author, but it comes with serious trade-offs: it breaks setPalette() and setFont(), ignores system dark/light mode changes, forces you to restyle all sub-controls when you customize one, and adds measurable startup and reparenting cost from CSS parsing.

A proper parametrized QStyle implementation (like Qlementine) avoids all of this — colors, spacing, animations, border-radii, and pixel metrics are computed natively in C++ with full QPainter access, zero parsing overhead, and complete respect for QPalette. The reason Python libraries haven't taken this approach is that subclassing QProxyStyle in Python incurs a C++/Python boundary crossing on every paint call, making it unperformant for anything beyond icon overrides.

Qlementine sidesteps that entirely: the style is implemented in C++ and simply exposed to Python (through these bindings), giving you the correctness and performance of a native QStyle implementation with the ease of use of a Python library (and parametrized geometry, colors, animations, and fonts through Qlementine's Theme API).

License

The code in this repository is licensed under the MIT License.

The packaged/distributed bindings are:

See the LICENSE file in each package for more details.

Developers & Contributing

Contributions are welcome! See CONTRIBUTING.md for dev tips.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyside6_qlementine-1.4.3.0rc2-cp310-abi3-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

pyside6_qlementine-1.4.3.0rc2-cp310-abi3-manylinux_2_34_x86_64.whl (2.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.34+ x86-64

pyside6_qlementine-1.4.3.0rc2-cp310-abi3-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file pyside6_qlementine-1.4.3.0rc2-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 8875d79d82343ea3d2f7be97ead62830a4d57766b2ec6db378d3ff0b3e535e69
MD5 08c24171d2e0aefd212e61fedde90bc7
BLAKE2b-256 bd5f6445aa1a3bf15f69c0bdc23ded7d3ccdaa358deb062fee6658a945d960e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-win_amd64.whl:

Publisher: publish-pyside6.yml on pyapp-kit/PyQlementine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyside6_qlementine-1.4.3.0rc2-cp310-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 a29d1a4da4f4a12eb60a2a5f2b220fe85459d647e93b42420eed5c5c74f25bf4
MD5 e2d1b4830fcaff90ba108e4495370346
BLAKE2b-256 59e5af9c52dbe64dc376de88568f40644c98c4a796a3f3e67c33681f5d3a2c31

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-manylinux_2_34_x86_64.whl:

Publisher: publish-pyside6.yml on pyapp-kit/PyQlementine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyside6_qlementine-1.4.3.0rc2-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9145d4db625766e05a31485117755ab7d92d5e4f1dea6a501d5ff7db672d5fc3
MD5 605803ab882de6829bacf4b5e9d7f13e
BLAKE2b-256 cf6931201fefbc4c6d826ab6d49ab1969d9f6ad1cb40cb7d1ed2067003b3b5b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyside6_qlementine-1.4.3.0rc2-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: publish-pyside6.yml on pyapp-kit/PyQlementine

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page