Home > PyQt5, python > PyQt5: QDial

PyQt5: QDial

16 Maggio 2019

Torna all’indice degli appunti

QDial

La classe QDial crea un widget rappresentante un potenziometro di forma circolare.
Ereditando da QAbstractSlider, utilizza i metodi ereditati da suddetta classe.
Il costruttore è ovviamente QDial:

>>> app = QApplication([])
>>> dial = QDial()

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

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

Per settare un range differente, si utilizzano i metodi setMinimum(minimum) e setMaximum(maximum):

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

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

>>> dial.setValue(150)
>>> dial.value()
150

REGOLAZIONE DIAL DA TASTIERA

I tasti utilizzabili da tastiera per regolare il dial sono:

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

REGOLAZIONE DIAL DA MOUSE

Se usiamo la rotella del mouse per regolare il dial, 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

Ecco un codice di esempio per vedere l’aspetto ed il comportamento del dial:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QDial


import sys


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(300, 250)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        dial = QDial()
        dial.setMinimum(5)
        dial.setMaximum(200)
        dial.setValue(100)  # setto l'indicatore a metà scala
        layout.addWidget(dial)


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

Premendo le frecce direzionali, PagUp/PagDown, Home/End, il dial si muove lungo gli step predefiniti.
Per modificare gli step, utilizziamo i metodi visti in precedenza:

>>> dial.setSingleStep(10)
>>> dial.singleStep()
10
>>> dial.setPageStep(50)
>>> dial.pageStep()
50

WRAPPING

Settando il flag wrapping a True, facciamo in modo che la rotella una volta raggiunto il valore massimo, riparta dal valore minimo, senza avere un gradino (ottenibile invece riportando a False, il flag.
Questa modalità si ottiene utilizzando il metodo setWrapping(bool). Per conoscere lo stato del flag, si utilizza il metodo wrapping:

>>> dial.setWrapping(True)
>>> dial.wrapping()
True

INDICATORI DI SCALA (notches)

Come si nota dalla figura precedente, il dial è privo di scala.
Per abilitare la scala del dial, si utilizza il metodo setNotchesVisible(bool).

Se vogliamo che i notches siano più fini, ovviamente bisognerà modificare il valore del single step, con il metodo setSingleStep(step).

...
class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        dial = QDial()
        dial.setMinimum(5)
        dial.setMaximum(200)
        dial.setValue(100)
        dial.setSingleStep(5)
        dial.setPageStep(50)
        layout.addWidget(dial)
        dial.setNotchesVisible(True)
...

SEGNALI

Il più importante è decisamente valueChanged, ereditato dalla classe QAbstractSlider.
Il segnale viene emesso quando il valore del dial viene modificato per via del metodo setValue(value).
Il valore è accessibile grazie al parametro value.

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

Ecco un altro esempio:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import (QWidget, QApplication, QBoxLayout, QDial, 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(150, 150)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(layout)
        minimum, maximum = 0, 200
        dial = QDial()
        dial.setMinimum(minimum)
        dial.setMaximum(maximum)
        dial.setSingleStep(5)
        dial.setPageStep(50)
        dial.setNotchesVisible(True)
        dial.setFixedSize(100, 100)
        val = dial.value()
        self.label = QLabel("Volume: %s" % val)
        self.bar = CustomProgressBar(minimum, maximum)

        layout.addWidget(dial)
        layout.addWidget(self.label)
        layout.addWidget(self.bar)

        dial.valueChanged.connect(self.on_value_change)

    def on_value_change(self, value):
        text = "Volume: %s" % value
        self.label.setText(text)
        self.bar.update(value)


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

Torna all’indice degli appunti

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