在QSpinBox中设置特定值

时间:2013-11-29 15:56:28

标签: qt qspinbox

我有一个包含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) ) );

然后出现了几个问题:

    在我调用其setValue后,
  1. QSpinBox会发出另一个valueChanged,从而导致无限循环(直到我的QVector爆炸)。
  2. 我仍然需要找到跟踪索引的方法,具体取决于点击的QSpinBox箭头中的哪一个(向上或向下......我甚至认为这不可能)。
  3. 所以我的解决方案及其问题似乎是一个死胡同。任何的想法?。如果可能的话,我想坚持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;
    };
    

2 个答案:

答案 0 :(得分:6)

我建议您通过对QAbstractSpinBox进行子类化来编写自己的类。

也许看一下这个问题的接受答案: How to subclass QSpinBox so it could have int64 values as maxium and minimum

答案 1 :(得分:2)

  

QSpinBox在调用其setValue后发出另一个valueChanged,导致无限循环(直到我的QVector爆炸)。

您可以使用QObject :: blockSignals()来防止这种情况。确保之后取消阻止信号。

  

我仍然需要找到跟踪索引的方法,具体取决于点击了哪个QSpinBox箭头(向上或向下......我甚至认为这不可能)。

好吧,我想您可以将旧值存储在成员变量中,当QSpinBox发出valueChanged()时,您可以将新值与旧值进行比较,以确定是否按下了向上或向下箭头。

那就是说,我不知道这是否足以使QSpinBox表现得像你想要的那样,在改变一次之后纠正这个值是有点hacky。子类化QAbstractSpinbox可能确实更好。