如何确定 QSlider 的移动方向?

How do I determine what direction a QSlider is being moved?

有没有办法获取 Qt 5.9 中 QSlider 的移动方向?

对于上下文,我正在制作一个 GUI,在总和低于 1 的情况下,用户可以在其中调整一些滑块。

滑块在彼此上方,如果您移动下方的滑块之一,则上方的滑块不会移动。但是,下面的人会这样做。

对于最后一个滑块,用户应该不能向上移动它,但应该允许向下移动它。

提前,谢谢:)

QSlider没有那个属性,所以最合理的做法是使用存储了前一个位置的逻辑创建一个class,在下面class我有实现这个逻辑,我还添加了一个信号来异步通知你:

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

在下面的部分中有一个使用这个 class 的例子:

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_())