1

qt ライブラリを使用してコードを書いています。このコードでは、スピン ボックスの値が変更される直前に (シグナルによって) 取得する必要があります。

私が持っている:

QSpinBox spinBoxWidth:
QSpinBox spinBoxScale;

spinBoxWidth から spinBoxScale に信号を接続して、SpinBoxScale の値が常に「変更後の SpinBoxWidth の値」から「変更前の値」になるようにします。

(スケール = width_new/width_old)

値の変更中にスピン ボックスの古い値を返す Qt のスロットが見つかりませんでした。どういうわけかそのためのスロットを書くことはできますか?

よろしくお願いします

4

2 に答える 2

3

これには 2 つの方法があります。

  • QKeyEvent変更が発生する前にキャッチし、イベント システム ( 、 )を使用して古い値を保存しますQMouseEventspinBoxWidthの値は手動で設定できるため、これはエラーが発生しやすくなります。
  • spinBoxWidthvalueChanged(int)信号をスロットに接続し、最後に呼び出された値を参照します。この方法をお勧めします。

次のようなことを試してください:

class MonitoringObject : public QObject
{
    Q_OBJECT
    int lastValue;
    int currentValue;
    ...
public Q_SLOTS:
    void onValueChanged(int newVal)
    {
        lastValue = currentValue;
        currentValue = newVal;
        if (lastValue == 0) //catch divide-by-zero
            emit ratioChanged(0);
        else
            emit ratioChanged(currentValue/lastValue);
    }
Q_SIGNALS:
    void ratioChanged(int);

シグナルが接続されると、フローは次のようになります。

  • spinBoxWidth発するvalueChanged(int)
  • MonitoringObject::onValueChanged(int)呼び出され、その作業を行い、発行しますratioChanged(int)
  • spinBoxScalesetValue(int)スロットで信号を受信し、適切な値を設定します。
于 2016-05-03T10:50:36.420 に答える
0

受信した前のシグナル「onValueChanged()」からいつでも保存できるため、「変更前の値」に特定のシグナルはないと思います。

したがって、基本的な考え方は次のようになります。

  1. 最初に、シグナル onValueChanged(value) を受信し、値 value_old を保存します。
  2. 次に信号を受信したときに、scale!value/value_old; を計算できます。
  3. 次に、新しいシグナルを送信するか、新しい値でオブジェクトを直接変更できます。

このコードを含む QSpinBox の独自のバージョンを派生させるか、シグナルを受信する必要があるクラスに実装することができます。アーキテクチャによって異なります。

于 2016-05-03T10:37:30.713 に答える