PyQt5: QDial
Torna all’indice degli appunti
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_())
Commenti recenti