2

QSlider が増加または減少したときに、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 に答える