2017-09-28 6 views
0

Existe-t-il un moyen d'obtenir la direction dans laquelle se déplace un QSlider dans Qt 5.9?Comment déterminer la direction dans laquelle un QSlider est déplacé?

Pour le contexte, je fais une interface graphique dans laquelle l'utilisateur peut régler certains curseurs, sous la condition que la somme totale est inférieure à 1.

Les curseurs sont au-dessus les uns des autres, et si vous déplacez l'un des curseur inférieur, ceux ci-dessus ne bouge pas. Ceux ci-dessous, cependant, font.

Pour le dernier curseur, l'utilisateur doit pas être capable de le déplacer vers le haut, mais devrait être autorisé à le déplacer vers le bas.

En avance, merci de

+0

Je suppose que y Vous pouvez simplement enregistrer la dernière valeur du curseur pour calculer la direction. Je ne pense pas que le curseur lui-même le fasse pour vous et vous obtenez seulement la nouvelle valeur, pas de delta ou quelque chose. – xander

+0

Si la valeur actuelle est supérieure à la valeur précédente - curseur déplacé vers l'avant et vers l'arrière sinon. – vahancho

Répondre

1

QSlider n'a pas cette propriété, de sorte que la chose la plus raisonnable est de créer une classe en utilisant la logique d'avoir stocké la position précédente, dans la classe suivante, je l'ai mis en œuvre cette logique J'ai également ajouté un signal pour vous informer de manière asynchrone:

class Slider(QSlider): 
    Nothing, Forward, Backward = range(3) 
    directionChanged = pyqtSignal(int) 
    def __init__(self, parent=None): 
     QSlider.__init__(self, parent) 
     self._direction = Slider.Nothing 
     self.last = self.value()/self.maximum() 
     self.valueChanged.connect(self.onValueChanged) 

    def onValueChanged(self, value): 
     current = value/self.maximum() 
     direction = Slider.Forward if self.last < current else Slider.Backward 
     if self._direction != direction: 
      self.directionChanged.emit(direction) 
      self._direction = direction 
     self.last = current 

    def direction(self): 
     return self._direction 

Dans la partie suivante, il est un exemple de l'utilisation de cette classe:

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setLayout(QVBoxLayout()) 
     slider = Slider(self) 
     slider.setOrientation(Qt.Horizontal) 
     self.layout().addWidget(slider) 
     slider.directionChanged.connect(self.onDirectionChanged) 
     slider.valueChanged.connect(self.onValueChanged) 

    def onDirectionChanged(self, direction): 
     if direction == Slider.Forward: 
      print("Forward") 
     elif direction == Slider.Backward: 
      print("Backward") 

    def onValueChanged(self, value): 
     dirstr = "Forward" if self.sender().direction() == Slider.Forward else "Backward" 
     print(value, dirstr) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Widget() 
    w.show() 
    sys.exit(app.exec_())