6

を含むウィジェットがありQSpinBoxます。このウィジェットにはQVector<int> Values. 私がやりたいことは、のみからQSpinBox発行された値を表示することです。Values

最初は、ウィジェットの新しいスロットとシグナルがうまくいくと思っていました。

スロット:

void ChangeSomeValue()
{
    // QVector<int> Values;
    // int Index;
    int val = Values[ Index ];
    emit( SomeValueChanged( val ) );
}

接続します:

connect( UI->MySpinBox, SIGNAL( valueChanged(int) ), this, SLOT( ChangeSomeValue() ) );
connect( this, SIGNAL( SomeValueChanged(int ) ), UI->MySpinBox, SLOT( setValue(int) ) );

しかし、いくつかの問題が発生します。

  1. QSpinBoxvalueChangedsetValue を呼び出した後に別のものを発行すると、無限ループが発生します (QVector爆発するまで)。
  2. QSpinBoxどちらの矢印がクリックされたか (上または下... これが可能だとは思いません)に応じて、まだ Index を追跡する方法を見つける必要があります。

そのため、問題のある私の解決策は行き止まりのようです。何か案が?。QSpinBoxできればにこだわりたいです。

ありがとう !

[編集]

サブクラス化:

class SpinBox : public QSpinBox
{
    Q_OBJECT
public:
    explicit SpinBox(const QVector<int> & values, QWidget * parent = 0) :
        QSpinBox(parent),
        mValues(values),
        mIndex(0)
    {
        qSort(mValues);
        setMinimum(mValues.at(0));
        setMaximum(mValues.at(mValues.size() - 1));
        setValue(mValues.at(0));
    }

protected:
    void stepBy(int steps) // re-implementaion
    {
        mIndex += steps;
        mIndex = qBound(0, mIndex, mValues.size() - 1);
        setValue(mValues.at(mIndex));
    }

private:
    QVector<int>    mValues;
    int             mIndex;
};
4

2 に答える 2

2

QSpinBox は、その setValue を呼び出した後に別の valueChanged を発行し、その結果、(QVector が爆発するまで) 無限ループが発生します。

QObject::blockSignals() を使用してこれを防ぐことができます。その後、必ず信号のブロックを解除してください。

QSpinBox のどの矢印がクリックされたか (上または下...) に応じて、Index を追跡する方法を見つける必要があります。これが可能だとは思いません)。

古い値をメンバー変数に格納できると思います。QSpinBox が出力したときにvalueChanged()、新しい値と古い値を比較して、上矢印または下矢印が押されたかどうかを判断できます。

とはいえ、それがあなたが望むように振る舞うのに十分かどうかはわかりませんQSpinBox。一度変更された後に値を修正するのは少しハッキーです。サブクラス化QAbstractSpinboxは確かに良いかもしれません。

于 2013-11-29T19:21:43.820 に答える