2

我试图触发来自 QSlider 的不同信号,以了解它何时增加或减少。不幸的是,由于我在我的控制之外创建的程序的限制,我无法跟踪滑块的值而只是进行比较。

有没有办法做到这一点?

4

3 回答 3

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);
    }
};

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

QSlider *mySlider = ...
ValueChangeTracker *tracker = new ValueChangeTracker(mySlider);
connect(tracker, SIGNAL(valueIncreased(int)), ...);
connect(tracker, SIGNAL(valueDecreased(int)), ...);
于 2012-12-07T19:49:05.207 回答
0

QSlider发出信号valueChanged,只需将其连接到插槽:

mySlider.valueChanged.connect(self.on_mySlider_valueChanged)

如果您愿意,可以在那里进行测试并发出自定义信号。

于 2012-12-07T19:39:09.893 回答
0

我不完全理解这个问题,也许举个例子会有所帮助。但是,如果您查看QSlidervalueChanged(int)的文档,它会在滑块的值更改时发出信号。

于 2012-12-07T19:40:02.113 回答