微调框QSpinBox

作用:允许用户按照一定的步长,来增加或减少其中显示的数值

有两种类型的微调框

  • QSpinBox - 用于整数的显示和输入
  • QDoubleSpinBox - 用于浮点数的显示和输入

包括最大值、最小值、当前值

// 获取和设置当前值
int value() const
void setValue(int val)

// 获取和设置最大值
int maximum() const
void setMaximum(int max)

// 获取和设置最小值
int minimum() const
void setMinimum(int min)

// 一次设置最大值和最小值
void setRange(int minimum, int maximum)

步长

即点击上下调整按钮时的单步改变值,就是点击一次,增加或减少的值

// 获取和设置步长
 int singleStep() const
 void setSingleStep(int val)

循环

数值达到最大值时,继续点击增加,值会回到最小

数值达到最小值时,点击减少,值会回到最大

// 获取和设置是否允许循环
bool wrapping() const
void setWrapping(bool w)

加速

即长按增加/减少按钮时,数值会快速的的增加/减少

// 获取和设置是否允许加速
bool isAccelerated() const
void setAccelerated(bool on)

前缀/后缀

可以设置微调框中显示前缀或者后缀

比如微调框中表示重量,则可以加一个KG的后缀

// 获取和设置前缀
QString prefix() const
void setPrefix(const QString &prefix)
 
// 获取和设置后缀
QString suffix() const
void setSuffix(const QString &suffix)

常用信号

//数值改变时发射
void valueChanged(int i)

举例

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QLabel>
#include<QSpinBox>
#include<QGridLayout>
#include<QMessageBox>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr):QWidget(parent)
    {
        resize(300,300);
        QGridLayout* grid=new QGridLayout(this);

        QLabel* lbl1=new QLabel("身高:",this);
        lbl1->setFixedSize(50,50);

        height=new QSpinBox(this);
        height->setRange(150,195);//设置范围
        height->setWrapping(true);//设置可以循环
        height->setSuffix("cm");//设置后缀
        height->setAccelerated(true);//设置加速
        height->setSingleStep(1);//设置步长
        grid->addWidget(lbl1,0,0);
        grid->addWidget(height,0,1);

        QLabel* lbl2=new QLabel("体重:",this);
        lbl2->setFixedSize(50,50);

        weight=new QSpinBox(this);
        weight->setRange(45,100);//设置范围
        weight->setWrapping(true);//设置可以循环
        weight->setSuffix("kg");//设置后缀
        weight->setAccelerated(true);//设置加速
        weight->setSingleStep(1);//设置步长
        grid->addWidget(lbl2,1,0);
        grid->addWidget(weight,1,1);

        //绑定槽函数
        connect(height,&QSpinBox::valueChanged,this,&Widget::onValueChange);
        connect(weight,&QSpinBox::valueChanged,this,&Widget::onValueChange);

    }
    ~Widget()=default;
private:
    void onValueChange()
    {
        QString str_text="身高"+QString::number(height->value())
                           +"cm,体重"+QString::number(weight->value())+"kg";
        QMessageBox::information(this,"",str_text);
    }

    QSpinBox* height;
    QSpinBox* weight;
};
#endif // WIDGET_H

学习链接:https://github.com/0voice

<think>嗯,用户问的是关于QtQSpinBox使用setRange后数值自动变化的原因和解决方法。首先,我需要回忆一下QSpinBox的基本工作原理。QSpinBox是一个微调框控件,用于处理整数值。当用户设置范围时,可能会触发值的调整,比如当前值如果不在新的范围内,就会被自动调整到最近的边界值。 根据提供的引用内容,引用[2]中提到,setRange方法可以设置范围,而setValue用于设置当前值。如果原有值不在新的范围内,调用setRange后,QSpinBox会自动将值调整为有效范围内的最近值。例如,如果原本的值是5,而新设置的范围是0到3,那么值会自动变为3。这时候会触发valueChanged信号,如引用[3]和[4]所述,当值变化时会发射这个信号。 那用户的问题应该是,在调用setRange之后,即使没有显式调用setValue,数值却发生了变化。这时候需要解释清楚这是因为当前值可能超出了新设置的范围,所以系统自动修正了。解决方法的话,可能需要在设置范围之前,先检查当前值是否在将要设置的范围内,如果不在,可以先保存原值,设置范围后再恢复,或者根据需求调整到合适的值。 另外,引用[1]提到QAbstractSpinBox::CorrectToPreviousValue这个选项,默认情况下如果输入无效值,会恢复到之前的值。不过在这个情况下,当范围改变导致当前值无效时,系统可能不会恢复,而是调整到边界值,这可能和默认行为不同,需要确认文档中的具体说明。不过根据用户的引用,默认行为是恢复为最后一个有效值,但可能当范围改变时处理方式不同。 所以总结原因就是,当setRange导致当前值超出新范围时,QSpinBox会自动调整到有效值,从而触发数值变化。解决方法包括在设置范围前处理原值,或者连接信号进行处理。</think>### QSpinBox使用setRange后数值自动变化的原因及解决方法 #### 原因分析 1. **自动修正机制** 当通过`setRange(v1, v2)`设置范围时,若当前值$n$不在$[v1, v2]$区间内,QSpinBox会触发**自动修正**,将值调整为最近的有效边界值。例如: - 原值$n=5$,设置范围`setRange(0,3)`后,值会自动修正为$3$[^2] - 原值$n=-2$,设置范围`setRange(0,10)`后,值会自动修正为$0$ 2. **信号触发** 值修正后会立即触发`valueChanged(int)`信号[^3][^4],若代码中已连接该信号,可能引发其他逻辑的连锁反应。 --- #### 解决方法 1. **显式设置值** 在调用`setRange()`前,手动将值设为范围内的有效值: ```cpp int current = spinBox->value(); spinBox->setRange(min, max); if (current < min || current > max) { spinBox->setValue(qBound(min, current, max)); // 强制限定到新范围 } ``` 2. **临时屏蔽信号** 若需避免信号干扰,可暂时断开信号连接: ```cpp spinBox->blockSignals(true); // 屏蔽信号 spinBox->setRange(min, max); spinBox->blockSignals(false); // 恢复信号 ``` 3. **利用CorrectToPreviousValue模式** 设置输入无效时的恢复策略(需继承QSpinBox)[^1]: ```cpp spinBox->setCorrectionMode(QAbstractSpinBox::CorrectToPreviousValue); ``` --- #### 验证示例 ```cpp QSpinBox *sbox = new QSpinBox; sbox->setRange(0, 100); sbox->setValue(50); sbox->setRange(0, 30); // 自动修正为30,触发valueChanged(30) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值