Qt 在QSpinBox中设置特定值
我有一个小部件,其中包含一个Qt 在QSpinBox中设置特定值,qt,qspinbox,Qt,Qspinbox,我有一个小部件,其中包含一个QSpinBox。此小部件还有一个QVector值。我想做的是让QSpinBox仅显示值发出的值 起初,我认为我的小部件中有一个新的插槽和信号会起作用,比如 插槽: void ChangeSomeValue() { // QVector<int> Values; // int Index; int val = Values[ Index ]; emit( SomeValueChanged( val ) ); } 但随后出现
QSpinBox
。此小部件还有一个QVector值
。我想做的是让QSpinBox
仅显示值发出的值
起初,我认为我的小部件中有一个新的插槽和信号会起作用,比如
插槽:
void ChangeSomeValue()
{
// QVector<int> Values;
// int Index;
int val = Values[ Index ];
emit( SomeValueChanged( val ) );
}
但随后出现了几个问题:
QSpinBox
在调用其setValue后发出另一个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;
};
class SpinBox:public QSpinBox
{
Q_对象
公众:
显式SpinBox(常量QVector和值,QWidget*父项=0):
QSpinBox(父级),
mValues(值),
mIndex(0)
{
qSort(mValues);
设置最小值(在(0)处的值);
setMaximum(mValues.at(mValues.size()-1));
设置值(在(0)处的值);
}
受保护的:
void steppy(int steps)//重新实现
{
mIndex+=步数;
mIndex=qBound(0,mIndex,mValues.size()-1);
设定值(mValues.at(mIndex));
}
私人:
向量值;
int mIndex;
};
我建议您编写自己的类,通过对QAbstractSpinBox进行子分类来完成这项工作
也许可以看看关于这个问题的公认答案:
QSpinBox发出另一个值,在我调用它的setValue后发生了变化,导致无限循环(直到我的QVector爆炸)
您可以通过使用QObject::blockSignals()来防止这种情况。之后确保信号畅通
我仍然需要找到一种方法来跟踪索引,这取决于点击了哪个QSpinBox箭头(向上或向下…我甚至认为这是不可能的)
好吧,我想您可以将旧值存储在一个成员变量中,当QSpinBox发出valueChanged()
时,您可以将新值与旧值进行比较,以确定是否按下了向上箭头或向下箭头
也就是说,我不知道这是否足以让QSpinBox
表现得像你想要的那样,在值被更改一次后更正它有点粗糙。子类化QAbstractSpinbox
可能确实更好。然后切换到类似QComboBox的东西可能会更快。起初我实际上开始写你建议的子类,但这看起来像是浪费时间。无论如何谢谢你!如果你经常使用这个类,这可能不是浪费时间。听起来对我很有用。嗯,如果我有空的话,我可能会在这个周末给它一个机会。我将相应地编辑我的问题。@CTZStef Nice。比执行完整的子类或QAbstractSpinBox更容易
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;
};