This commit is contained in:
Talley Lambert
2021-04-24 21:07:40 -04:00
parent d13648c6dc
commit 9fde133977
18 changed files with 118 additions and 37 deletions

1
.gitignore vendored
View File

@@ -77,4 +77,3 @@ target/
# written by setuptools_scm
*/_version.py
screenshots/

View File

@@ -12,7 +12,7 @@ modification, are permitted provided that the following conditions are met:
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of pyqrangeslider nor the names of its
* Neither the name of QtRangeSlider nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

118
README.md
View File

@@ -1,34 +1,116 @@
# PyQRangeSlider
# QtRangeSlider
[![License](https://img.shields.io/pypi/l/PyQRangeSlider.svg?color=green)](https://github.com/tlambert03/PyQRangeSlider/raw/master/LICENSE)
[![PyPI](https://img.shields.io/pypi/v/PyQRangeSlider.svg?color=green)](https://pypi.org/project/PyQRangeSlider)
[![Python Version](https://img.shields.io/pypi/pyversions/PyQRangeSlider.svg?color=green)](https://python.org)
[![Test](https://github.com/tlambert03/PyQRangeSlider/actions/workflows/test_and_deploy.yml/badge.svg)](https://github.com/tlambert03/PyQRangeSlider/actions/workflows/test_and_deploy.yml)
[![codecov](https://codecov.io/gh/tlambert03/PyQRangeSlider/branch/master/graph/badge.svg)](https://codecov.io/gh/tlambert03/PyQRangeSlider)
[![License](https://img.shields.io/pypi/l/QtRangeSlider.svg?color=green)](https://github.com/tlambert03/QtRangeSlider/raw/master/LICENSE)
[![PyPI](https://img.shields.io/pypi/v/QtRangeSlider.svg?color=green)](https://pypi.org/project/QtRangeSlider)
[![Python
Version](https://img.shields.io/pypi/pyversions/QtRangeSlider.svg?color=green)](https://python.org)
[![Test](https://github.com/tlambert03/QtRangeSlider/actions/workflows/test_and_deploy.yml/badge.svg)](https://github.com/tlambert03/QtRangeSlider/actions/workflows/test_and_deploy.yml)
[![codecov](https://codecov.io/gh/tlambert03/QtRangeSlider/branch/master/graph/badge.svg)](https://codecov.io/gh/tlambert03/QtRangeSlider)
Multi-handle range slider widget for PyQt/PySide
**Multi-handle range slider widget for PyQt/PySide**
The goal of this package is to provide a QRangeSlider that feels as "native"
as possible. Styles should match the OS by default, and the slider should
behave like a standard QSlider... just with multiple handles.
![slider](screenshots/slider.png)
- Supports more than 2 handles (e.g. `slider.setValue([0, 10, 60, 80])`)
- Attempts to match QSlider API as closely as possible
- Uses platform-specific styles (for handle, groove, & ticks) but also supports QSS style sheets.
The goal of this package is to provide a Range Slider (a slider with 2 or more
handles) that feels as "native" as possible. Styles should match the OS by
default, and the slider should behave like a standard
[`QSlider`](https://doc.qt.io/qt-5/qslider.html)... but with multiple handles!
- `QRangeSlider` inherits from [`QSlider`](https://doc.qt.io/qt-5/qslider.html)
and attempts to match the Qt API as closely as possible
- Uses platform-specific styles (for handle, groove, & ticks) but also supports
QSS style sheets.
- Supports mouse wheel and keypress (soon) events
- Supports PyQt5, PyQt6, PySide2 and PySide6
- Supports more than 2 handles (e.g. `slider.setValue([0, 10, 60, 80])`)
## Installation
You can install `PyQRangeSlider` via pip:
You can install `QtRangeSlider` via pip:
pip install pyqrangeslider
```sh
pip install qtrangeslider
# note: you must also install a Qt Backend
# supports PyQt5, PySide2, PyQt6, and PySide6
# as a convenience you can install via extras:
pip install qtrangeslider[pyqt5]
```
And then to use it:
```python
from qtrangeslider import QRangeSlider
```
## API
As `QRangeSlider` inherits from `QtWidgets.QSlider`, you can use all of the
same methods available in the [QSlider API](https://doc.qt.io/qt-5/qslider.html)
## Example
These screenshots show `QRangeSlider` (multiple handles) next to the native `QSlider`
(single handle). With no styles applied, `QRangeSlider` will match the native OS
style of `QSlider` with or without tick marks. When styles have been applied
using [Qt Style Sheets](https://doc.qt.io/qt-5/stylesheet-reference.html), then
`QRangeSlider` will inherit any styles applied to `QSlider` (since it inherits
from QSlider).
<details>
<summary><em>See style sheet used for this example</em></summary>
```css
/* Because QRangeSlider inherits QSlider, it will also inherit styles */
QSlider::groove:horizontal {
border: 0px;
background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #FDE282, stop:1 #EB9A5D);
height: 16px;
border-radius: 2px;
}
QSlider::handle:horizontal {
background: #271848;
border: 1px solid #583856;
width: 18px;
margin: -2px 0;
border-radius: 3px;
}
QSlider::handle:hover {
background-color: #2F4F4F;
}
/* "QSlider::sub-page" will style the "bar" area between the QRangeSlider handles */
QSlider::sub-page:horizontal {
background: #AF5A50;
border-radius: 2px;
}
```
</details>
### macOS
![mac](screenshots/demo_macos.png)
### Window
(coming)
<!-- ![mac](screenshots/demo_windows.png) -->
### Linux
(coming)
<!-- ![mac](screenshots/demo_linux.png) -->
## Issues
If you encounter any problems, please [file an issue] along with a detailed description.
If you encounter any problems, please [file an issue] along with a detailed
description.
[file an issue]: https://github.com/tlambert03/PyQRangeSlider/issues
[file an issue]: https://github.com/tlambert03/QtRangeSlider/issues

View File

@@ -1,5 +1,5 @@
from pyqrangeslider import QRangeSlider
from pyqrangeslider.qtcompat.QtWidgets import QApplication
from qtrangeslider import QRangeSlider
from qtrangeslider.qtcompat.QtWidgets import QApplication
app = QApplication([])

View File

@@ -1,5 +1,5 @@
from pyqrangeslider import QRangeSlider
from pyqrangeslider.qtcompat.QtWidgets import QApplication
from qtrangeslider import QRangeSlider
from qtrangeslider.qtcompat.QtWidgets import QApplication
app = QApplication([])

View File

@@ -1,6 +1,6 @@
from pyqrangeslider import QRangeSlider
from pyqrangeslider.qtcompat import QtCore
from pyqrangeslider.qtcompat import QtWidgets as QtW
from qtrangeslider import QRangeSlider
from qtrangeslider.qtcompat import QtCore
from qtrangeslider.qtcompat import QtWidgets as QtW
QSS = """
@@ -65,7 +65,7 @@ class DemoWidget(QtW.QWidget):
szp = QtW.QSizePolicy.Maximum
left = QtW.QWidget()
left.setLayout(QtW.QVBoxLayout())
left.setContentsMargins(0, 0, 0, 0)
left.setContentsMargins(2, 2, 2, 2)
label1 = QtW.QLabel("Regular QSlider Unstyled")
label2 = QtW.QLabel("QRangeSliders Unstyled")
label3 = QtW.QLabel("Styled Sliders (using same stylesheet)")

View File

@@ -1,7 +1,7 @@
import pytest
from pyqrangeslider import QRangeSlider
from pyqrangeslider.qtcompat.QtCore import Qt
from qtrangeslider import QRangeSlider
from qtrangeslider.qtcompat.QtCore import Qt
@pytest.mark.parametrize("orientation", ["Horizontal", "Vertical"])

BIN
screenshots/demo_macos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
screenshots/slider.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@@ -1,6 +1,6 @@
[metadata]
name = PyQRangeSlider
url = https://github.com/tlambert03/PyQRangeSlider
name = QtRangeSlider
url = https://github.com/tlambert03/QtRangeSlider
license = BSD-3
license_file = LICENSE
description = Multi-handle range slider widget for PyQt/PySide
@@ -10,9 +10,9 @@ author = Talley Lambert
author_email = talley.lambert@gmail.com
keywords = qt, range slider, widget
project_urls =
Source = https://github.com/tlambert03/PyQRangeSlider
Tracker = https://github.com/tlambert03/PyQRangeSlider/issues
Changelog = https://github.com/tlambert03/PyQRangeSlider/blob/master/CHANGELOG.md
Source = https://github.com/tlambert03/QtRangeSlider
Tracker = https://github.com/tlambert03/QtRangeSlider/issues
Changelog = https://github.com/tlambert03/QtRangeSlider/blob/master/CHANGELOG.md
classifiers =
Development Status :: 4 - Beta
Environment :: X11 Applications :: Qt

View File

@@ -5,6 +5,6 @@ so this file is currently here to support "pip install -e ."
from setuptools import setup
setup(
use_scm_version={"write_to": "pyqrangeslider/_version.py"},
use_scm_version={"write_to": "qtrangeslider/_version.py"},
setup_requires=["setuptools_scm"],
)

View File

@@ -39,4 +39,4 @@ extras =
pyside2: pyside2
pyqt6: pyqt6
pyside6: pyside6
commands = pytest -v --color=yes --cov=pyqrangeslider --cov-report=xml
commands = pytest -v --color=yes --cov=qtrangeslider --cov-report=xml