有没有办法在QSlider值增加时生成信号

jon*_*opf 2 qt slider signals-slots

我试图从QSlider触发一个明显的信号,以了解它的增大或减小。不幸的是,由于程序的限制,我无法在控件范围内创建,因此无法跟踪滑块的值,只能进行比较。

有没有办法做到这一点?

lee*_*mes 5

如果我对您的理解正确,valueChanged(int)则由于无法跟踪该值,因此无法决定该值是增加还是减少。但是,您需要这样做,因为QSlider没有明显的信号来表示增加/减小的值。

使用此帮助程序类来跟踪当前值。它将valueChanged(int)提供的目标对象的信号重新映射为新信号,valueIncreased(int)valueDecreased(int)告知(绝对)差异。

class ValueChangeTracker : public QObject
{
    Q_OBJECT
    int v;
public:
    ValueChangeTracker(QObject *target) :
        QObject(target)
    {
        connect(target, SIGNAL(valueChanged(int)), SLOT(changed(int)));
        v = target->property("value"); // or ->value() if you specifically use QSlider* instead of QObject* as the target type
    }
signals:
    void valueIncreased(int);
    void valueDecreased(int);
private slots:
    void changed(int newValue) {
        int diff = newValue - v;
        v = newValue;
        if(diff > 0) emit valueIncreased(diff);
        if(diff < 0) emit valueDecreased(-diff);
    }
};
Run Code Online (Sandbox Code Playgroud)

要使用它,只需创建此类的新实例并连接到其信号即可。在QObject树中,它成为目标对象的子代,因此您不必保留指向实例的指针。

QSlider *mySlider = ...
ValueChangeTracker *tracker = new ValueChangeTracker(mySlider);
connect(tracker, SIGNAL(valueIncreased(int)), ...);
connect(tracker, SIGNAL(valueDecreased(int)), ...);
Run Code Online (Sandbox Code Playgroud)