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. QSpinBox在我调用它的 setValue 后发出另一个valueChanged,导致无限循环(直到我QVector爆炸)。
  2. 我仍然必须找到一种方法来跟踪索引,具体取决于QSpinBox单击了哪个箭头(向上或向下......我什至认为这是不可能的)。

因此,我的解决方案及其问题似乎是一条死胡同。任何想法?。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

6

我建议编写自己的类来通过子类化 QAbstractSpinBox 来实现。

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

于 2013-11-29T16:00:18.470 回答
2

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

你可以通过使用 QObject::blockSignals() 来防止这种情况。确保之后解锁信号。

我仍然必须找到一种方法来跟踪索引,这取决于单击了哪个 QSpinBox 箭头(向上或向下......我什至认为这是不可能的)。

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

就是说,我不知道这是否足以使QSpinBox行为像您想要的那样,在更改一次后更正该值有点笨拙。子类化QAbstractSpinbox可能确实更好。

于 2013-11-29T19:21:43.820 回答