Metadata-Version: 2.4
Name: qtextra
Version: 0.2.0
Summary: Extra widgets for Qt
Project-URL: homepage, https://github.com/lukasz-migas/qtextra
Project-URL: repository, https://github.com/lukasz-migas/qtextra
Author-email: "Lukasz G. Migas" <lukas.migas@yahoo.com>
License: BSD 3-Clause License
License-File: LICENSE
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: BSD License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: appdirs
Requires-Dist: koyo>=0.3.5
Requires-Dist: numpy
Requires-Dist: psygnal>=0.14.2; python_version <= '3.9'
Requires-Dist: psygnal>=0.15.0; python_version >= '3.10'
Requires-Dist: pydantic-extra-types
Requires-Dist: pydantic>2
Requires-Dist: qtawesome
Requires-Dist: qtpy
Requires-Dist: superqt>=0.7.1
Provides-Extra: all
Requires-Dist: ipykernel>=5.2.0; extra == 'all'
Requires-Dist: pandas; extra == 'all'
Requires-Dist: polars[pandas]; extra == 'all'
Requires-Dist: pyqt6; (platform_system != 'Windows') and extra == 'all'
Requires-Dist: pyqt6>6.9.0; (platform_system == 'Windows') and extra == 'all'
Requires-Dist: qtconsole!=4.7.6,!=5.4.2,>=4.5.1; extra == 'all'
Requires-Dist: sentry-sdk>2; extra == 'all'
Provides-Extra: console
Requires-Dist: ipykernel>=5.2.0; extra == 'console'
Requires-Dist: qtconsole!=4.7.6,!=5.4.2,>=4.5.1; extra == 'console'
Provides-Extra: dev
Requires-Dist: check-manifest; extra == 'dev'
Requires-Dist: ipython; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: pdbpp; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest-pretty; extra == 'dev'
Requires-Dist: pytest-qt; extra == 'dev'
Requires-Dist: pytest>=8.1; extra == 'dev'
Requires-Dist: qtreload; extra == 'dev'
Requires-Dist: rich; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Provides-Extra: df
Requires-Dist: pandas; extra == 'df'
Requires-Dist: polars[pandas]; extra == 'df'
Provides-Extra: docs
Requires-Dist: ipykernel>=5.2.0; extra == 'docs'
Requires-Dist: mkdocs-macros-plugin>=1.3.9; extra == 'docs'
Requires-Dist: mkdocs-material>=9.6.20; extra == 'docs'
Requires-Dist: mkdocs-video>=1.5.0; extra == 'docs'
Requires-Dist: mkdocstrings-python>=1.18.2; extra == 'docs'
Requires-Dist: mkdocstrings>=0.30.0; extra == 'docs'
Requires-Dist: qtconsole!=4.7.6,!=5.4.2,>=4.5.1; extra == 'docs'
Requires-Dist: sentry-sdk>2; extra == 'docs'
Provides-Extra: pyqt5
Requires-Dist: pyqt5; extra == 'pyqt5'
Provides-Extra: pyqt6
Requires-Dist: pyqt6; (platform_system != 'Windows') and extra == 'pyqt6'
Requires-Dist: pyqt6>6.9.0; (platform_system == 'Windows') and extra == 'pyqt6'
Provides-Extra: pyside2
Requires-Dist: pyside2; extra == 'pyside2'
Provides-Extra: pyside6
Requires-Dist: pyside6; (platform_system != 'Windows') and extra == 'pyside6'
Requires-Dist: pyside6>6.9.0; (platform_system == 'Windows') and extra == 'pyside6'
Provides-Extra: reload
Requires-Dist: qtreload; extra == 'reload'
Provides-Extra: sentry
Requires-Dist: sentry-sdk>2; extra == 'sentry'
Provides-Extra: test
Requires-Dist: pytest-cov; extra == 'test'
Requires-Dist: pytest-pretty; extra == 'test'
Requires-Dist: pytest-qt; extra == 'test'
Requires-Dist: pytest>=8.1; extra == 'test'
Description-Content-Type: text/markdown

# qtextra

[![License](https://img.shields.io/pypi/l/qtextra.svg?color=green)](https://github.com/lukasz-migas/qtextra/raw/main/LICENSE)
[![PyPI](https://img.shields.io/pypi/v/qtextra.svg?color=green)](https://pypi.org/project/qtextra)
[![Python Version](https://img.shields.io/pypi/pyversions/qtextra.svg?color=green)](https://python.org)
[![Test](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml/badge.svg?branch=main)](https://github.com/lukasz-migas/qtextra/actions/workflows/test_and_deploy.yml)
[![codecov](https://codecov.io/gh/lukasz-migas/qtextra/branch/main/graph/badge.svg)](https://codecov.io/gh/lukasz-migas/qtextra)

### Extra widgets and dialogs for PyQt/PySide via `qtpy`

`qtextra` packages reusable Qt widgets, dialogs, and helpers that sit on top of
PyQt/PySide through [`qtpy`](https://github.com/spyder-ide/qtpy). The library
focuses on opinionated, application-level building blocks such as searchable
comboboxes, step progress indicators, styled buttons, collapsible sections, and
utility dialogs.

![qtextra widget showcase](docs/assets/readme_showcase.jpg)

Components are tested on:

- macOS, Windows & Linux
- Python 3.10 and above
- PyQt5 (5.11 and above) & PyQt6
- PySide2 (5.11 and above) & PySide6

The project overlaps somewhat with [superqt](https://github.com/pyapp-kit/superqt),
but it leans more heavily into application-ready widgets and bundled styling in
[`src/qtextra/assets/stylesheets`](src/qtextra/assets/stylesheets).

## Documentation

Documentation is available at https://lukasz-migas.github.io/qtextra/

## Installation

```bash
pip install qtextra
```

Optional extras:

```bash
pip install "qtextra[console,sentry]"
```

## Quick Start

```python
from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget

from qtextra.config import THEMES
from qtextra.widgets.qt_collapsible import QtCheckCollapsible
from qtextra.widgets.qt_progress_step import QtStepProgressBar

app = QApplication([])

window = QWidget()
layout = QVBoxLayout(window)

steps = QtStepProgressBar()
steps.labels = ["Load", "Validate", "Export"]
steps.value = 2
layout.addWidget(steps)

details = QtCheckCollapsible("Advanced options")
details.addRow("Status", QWidget())
layout.addWidget(details)

THEMES.apply(window)
window.show()
app.exec_()
```

A larger showcase example is available at [`examples/qt_readme_showcase.py`](examples/showcase.py).

## Documentation

- Automatic widget generation: [`docs/auto.md`](docs/auto.md)
- Mixins reference: [`docs/mixins.md`](docs/mixins.md)
- User guides: [`docs/`](docs)
- Widgets overview: [`docs/widgets/index.md`](docs/widgets/index.md)
- Dialogs overview: [`docs/dialogs/index.md`](docs/dialogs/index.md)
- Examples: [`examples/`](examples)

## Contributing

Contributions are always welcome. Please feel free to submit PRs with new features, bug fixes, or documentation improvements.

```bash
git clone https://github.com/lukasz-migas/qtextra.git

pip install -e ".[dev]"
pytest
```
