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 # written by setuptools_scm
*/_version.py */_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 this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. 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 contributors may be used to endorse or promote products derived from
this software without specific prior written permission. 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) [![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/PyQRangeSlider.svg?color=green)](https://pypi.org/project/PyQRangeSlider) [![PyPI](https://img.shields.io/pypi/v/QtRangeSlider.svg?color=green)](https://pypi.org/project/QtRangeSlider)
[![Python Version](https://img.shields.io/pypi/pyversions/PyQRangeSlider.svg?color=green)](https://python.org) [![Python
[![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) Version](https://img.shields.io/pypi/pyversions/QtRangeSlider.svg?color=green)](https://python.org)
[![codecov](https://codecov.io/gh/tlambert03/PyQRangeSlider/branch/master/graph/badge.svg)](https://codecov.io/gh/tlambert03/PyQRangeSlider) [![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" ![slider](screenshots/slider.png)
as possible. Styles should match the OS by default, and the slider should
behave like a standard QSlider... just with multiple handles.
- Supports more than 2 handles (e.g. `slider.setValue([0, 10, 60, 80])`) The goal of this package is to provide a Range Slider (a slider with 2 or more
- Attempts to match QSlider API as closely as possible handles) that feels as "native" as possible. Styles should match the OS by
- Uses platform-specific styles (for handle, groove, & ticks) but also supports QSS style sheets. 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 mouse wheel and keypress (soon) events
- Supports PyQt5, PyQt6, PySide2 and PySide6 - Supports PyQt5, PyQt6, PySide2 and PySide6
- Supports more than 2 handles (e.g. `slider.setValue([0, 10, 60, 80])`)
## Installation ## 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 ## 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 qtrangeslider import QRangeSlider
from pyqrangeslider.qtcompat.QtWidgets import QApplication from qtrangeslider.qtcompat.QtWidgets import QApplication
app = QApplication([]) app = QApplication([])

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
import pytest import pytest
from pyqrangeslider import QRangeSlider from qtrangeslider import QRangeSlider
from pyqrangeslider.qtcompat.QtCore import Qt from qtrangeslider.qtcompat.QtCore import Qt
@pytest.mark.parametrize("orientation", ["Horizontal", "Vertical"]) @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] [metadata]
name = PyQRangeSlider name = QtRangeSlider
url = https://github.com/tlambert03/PyQRangeSlider url = https://github.com/tlambert03/QtRangeSlider
license = BSD-3 license = BSD-3
license_file = LICENSE license_file = LICENSE
description = Multi-handle range slider widget for PyQt/PySide description = Multi-handle range slider widget for PyQt/PySide
@@ -10,9 +10,9 @@ author = Talley Lambert
author_email = talley.lambert@gmail.com author_email = talley.lambert@gmail.com
keywords = qt, range slider, widget keywords = qt, range slider, widget
project_urls = project_urls =
Source = https://github.com/tlambert03/PyQRangeSlider Source = https://github.com/tlambert03/QtRangeSlider
Tracker = https://github.com/tlambert03/PyQRangeSlider/issues Tracker = https://github.com/tlambert03/QtRangeSlider/issues
Changelog = https://github.com/tlambert03/PyQRangeSlider/blob/master/CHANGELOG.md Changelog = https://github.com/tlambert03/QtRangeSlider/blob/master/CHANGELOG.md
classifiers = classifiers =
Development Status :: 4 - Beta Development Status :: 4 - Beta
Environment :: X11 Applications :: Qt 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 from setuptools import setup
setup( setup(
use_scm_version={"write_to": "pyqrangeslider/_version.py"}, use_scm_version={"write_to": "qtrangeslider/_version.py"},
setup_requires=["setuptools_scm"], setup_requires=["setuptools_scm"],
) )

View File

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