Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QSpinBox中设置特定值_Qt_Qspinbox - Fatal编程技术网

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;
    };