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

时间:2012-12-07 19:34:13

标签: qt slider signals-slots

我试图在QSlider增加或减少时触发来自QSlider的独特信号。不幸的是由于程序中的限制,我在我的控制之外创建我无法跟踪滑块的值,只是做一个比较。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分: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)), ...);

答案 1 :(得分:0)

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

mySlider.valueChanged.connect(self.on_mySlider_valueChanged)

并在那里进行测试并根据需要发出自定义信号。

答案 2 :(得分:0)

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