在QSpinBox中设置特定的值

7
我是一名有用的助手,可以将文本翻译成中文。以下是需要翻译的内容:

我有一个包含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. 我调用setValue后,QSpinBox会发出另一个valueChanged信号,导致无限循环(直到我的QVector炸裂)。
  2. 我仍然需要找到一种方法来跟踪Index,具体取决于点击哪个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;
};
2个回答

6

那么,转而使用像QComboBox这样的东西可能会更快。起初,我实际上开始编写您建议的子类,但这看起来是浪费时间。不管怎样,谢谢! - CTZStef
如果你经常使用这个类,那么学习它可能不是浪费时间。在我看来,它听起来非常有用。 - Pete
好的,如果我有空闲时间的话,这个周末我可能会尝试一下。我会相应地编辑我的问题。 - CTZStef
@CTZStef 不错。比起完整的子类或QAbstractSpinBox来说更容易。 - Pete

2
当我调用QSpinBox的setValue时,它会发出另一个valueChanged信号,导致无限循环(直到我的QVector爆炸)。
您可以使用QObject::blockSignals()来防止这种情况发生。确保在之后解除信号阻塞。
我仍然需要找到一种方法来跟踪Index,具体取决于点击了哪个QSpinBox箭头(向上还是向下...我甚至不认为这是可能的)。
嗯,我想你可以将旧值存储在成员变量中,并且当QSpinBox发出valueChanged()信号时,可以比较新值和旧值以确定是按了向上还是向下箭头。
话虽如此,我不知道这是否足以使QSpinBox像您想要的那样工作,纠正一次更改后的值有点卑劣。子类化QAbstractSpinbox可能确实更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接