我有一个包含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) ) );
然后出现了几个问题:
QSpinBox
会发出另一个valueChanged
,从而导致无限循环(直到我的QVector
爆炸)。 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;
};
答案 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
可能确实更好。