Home > PyQt5, python > PyQt5: QSlider

PyQt5: QSlider

16 Maggio 2019

Torna all’indice degli appunti

QSlider

La classe QSlider crea un widget rappresentante un cursore, che, spostato traduce la sua posizione nel numero corrispondente.
Le funzionalità dell’oggetto QSlider, sono ereditate dalla classe QAbstractSlider.
Per creare l’oggetto cursore, si utilizza il costruttore è QSlider:

>>> from PyQt5.QtWidgets import QApplication, QSlider
>>> app = QApplication([])
>>> slider = QSlider()

Di default il valore del range minimo e massimo dello Slider è 0-99.
Questi valori sono reperibili con i due metodi minimum e maximum:

>>> Slider.minimum()
0
>>> Slider.maximum()
99

Per settare un range differente, si utilizzano i metodi setMinimum(minimum), setMaximum(maximum), o in un colpo solo setRange(minimum, maximum):

>>> slider.setMinimum(5)
>>> slider.setMaximum(300)
>>> slider.minimum()
5
>>> slider.maximum()
300

Il valore sul quale si posizionerà il Slider, è settabile con il metodo setValue(value) e ottenibile con value:

>>> slider.setValue(50)
>>> slider.value()
50

REGOLAZIONE Slider DA TASTIERA

I tasti utilizzabili da tastiera per regolare lo Slider sono:

frecce sx/su e rx/giù: aggiustano il valore dello Slider dello step definito con il metodo setSingleStep(step);
Pag Down/Pag Up: aggiustano il valore del Slider dello step definito con il metodo setPageStep(step);
Home: porta il Slider al valore minimo, definito con il metodo setMinimum(minimum);
End: porta il Slider al valore massimo, definito con il metodo setMaximum(maximum);

REGOLAZIONE DIAL DA MOUSE

Se usiamo la rotella del mouse per regolare lo slider, il valore incrementato sarà quello determinato con il metodo setSingleStep(step).
Il valore di default dello scroll, è reperibile dall’istanza della classe QStyleHints, classe che permette di accedere a specifici settaggi relativi alla piattaforma corrente. L’istanza di tale classe è ottenibile con il metodo styeHints dell’oggetto QApplication.

>>> from PyQt5.QtWidgets import QApplication
>>> app = QApplication([])
>>> hints = app.styleHints()
>>> hints.wheelScrollLines()
3

ORIENTAMENTO

Di default, l’orientamento dello slider è verticale. Per cambiarlo si utilizza il metodo setOrientation(orientation) dove orientation può essere uno tra gli enum: Qt.Horizontal di valore 1, o Qt.Vertical, di valore 2.

>>> from PyQt5.QtCore import Qt
>>> slider.orientation()
2
>>> slider.setOrientation(Qt.Horizontal)
>>> slider.orientation()
1

TICK MARKS

I tick marks rappresentano la linea graduata dello slider. Di default la linea graduata non viene visualizzata.
Per definire in quale posizione visualizzare i tick marks, si utilizza il metodo setTickPosition(position), dove position può essere uno tra i seguenti enum di QSlider:

costante valore descrizione
QSlider.NoTicks 0 Default: nessuna scala graduata
QSlider.TicksBothSides 3 Disegna la scala graduata da entrambi i lati del cursore
QSlider.TicksAbove 1 Disegna la scala graduata sopra al cursore con orientamento verticale
QSlider.TicksBelow 2 Disegna la scala graduata sotto al cursore con orientamento orizzontale
QSlider.TicksLeft 1 Disegna la scala graduata a sinistra del cursore con orientamento verticale
QSlider.TicksRight 2 Disegna la scala graduata a destra del cursore con orientamento verticale
>>> slider.tickPosition()
0
>>> slider.setTickPosition(QSlider.TicksBothSides)
>>> slider.tickPosition()
3

E’ possibile anche modificare il tick Interval, ovvero ogni quanti step disegnare una tacca, con il metodo setTickInterval(step).
Per sapere invece il tick interval dello slider, si utilizza il metodo tickInterval:

>>> slider.setTickInterval(5)
>>> slider.tickInterval()
5

Di seguito il codice che crea il widget:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import (QWidget, QApplication, QVBoxLayout, QSlider,
                             QProgressBar)
from PyQt5.QtCore import Qt


import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QSlider Example")
        self.central_widget = FormWidget(parent=self)
        self.setCentralWidget(self.central_widget)
        self.resize(400, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QVBoxLayout()
        self.setLayout(layout)
        slider = QSlider(orientation=Qt.Horizontal)
        slider.setRange(0, 200)
        slider.setTickPosition(QSlider.TicksBothSides)
        slider.setSingleStep(5)
        slider.setPageStep(50)
        slider.setTickInterval(5)
        slider.setOrientation(Qt.Horizontal)
        layout.addWidget(slider)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow(parent=None)
    main_window.show()
    sys.exit(app.exec_())

SEGNALI

I principali segnali da tenere in considerazione nelle slider, sono:

valueChanged: Emesso qualdo il valore dello slider viene modificato;

>>> slider.valueChanged.connect(lambda value: print("[SIG] value changed to: %s" % value))
<PyQt5.QtCore.QMetaObject.Connection object at 0x035BCD30>
>>> slider.setValue(60)
[SIG] value changed to: 60

sliderPressed: Emesso quando si clicca sul cursore dello slider per trascinarlo;
sliderMoved: Emesso quando lo slider si muove;
sliderReleased: Emesso quando il cursore dello slider viene rilasciato;

Ovviamente in una applicazione pratica, il segnale più frquentemente utilizzato è il primo, ad esempio, per aggiornare un widget legato al valore dello slider:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import (QWidget, QApplication, QGridLayout, QSlider,
                             QLabel, QProgressBar)
from PyQt5.QtCore import Qt


import sys


class CustomProgressBar(QProgressBar):
    def __init__(self, minimum, maximum):
        super(CustomProgressBar, self).__init__()
        self.setRange(minimum, maximum)
        self.setAlignment(Qt.AlignCenter)
        self._text = "0/0 (0%)"
        self.setFormat("%v/%m (%p%)")

    def set_text(self, text):
        self._text = text

    def text(self):
        return self._text

    def update(self, step):
        maximum = self.maximum()
        rate = step * 100 / maximum
        string = "{}/{} ({}%)".format(step, maximum, rate)
        self.set_text(string)
        self.setValue(step)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QDial Example")
        self.central_widget = FormWidget(parent=self)
        self.setCentralWidget(self.central_widget)
        self.resize(400, 200)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QGridLayout()
        self.setLayout(layout)
        minimum, maximum = 0, 200
        l_slider = QSlider()
        l_slider.setObjectName("left")
        r_slider = QSlider()
        r_slider.setObjectName("right")
        for row, slider in enumerate((l_slider, r_slider)):
            slider.setRange(0, 200)
            slider.setTickPosition(QSlider.TicksBelow)
            slider.setOrientation(Qt.Horizontal)
            slider.setSingleStep(5)
            slider.setPageStep(25)
            layout.addWidget(slider, row, 1)
            slider.valueChanged.connect(self.on_slider)
        self.l_bar = CustomProgressBar(minimum, maximum)
        self.r_bar = CustomProgressBar(minimum, maximum)
        layout.addWidget(QLabel("left"), 0, 0)
        layout.addWidget(QLabel("right"), 1, 0)
        layout.addWidget(self.l_bar, 0, 2)
        layout.addWidget(self.r_bar, 1, 2)

    def on_slider(self, value):
        slider = self.sender()
        if slider.objectName().lower() == "left":
            self.l_bar.update(value)
        else:
            self.r_bar.update(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow(parent=None)
    main_window.show()
    sys.exit(app.exec_())

Come si nota dal codice, è possibile assegnare un nome all’oggetto creato, con il metodo setObjectName(name) ed è possibile reperirlo con il metodo objectName. Ovviamente non ci sarebbero questi problemi collegando gli eventi dei singoli widget, a slot non condivisi.

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.