QSpinBoxQt框架中用于整数数字输入和显示的控件,允许用户通过上下箭头按钮或直接键盘输入来调整数值

  • 范围限制:可以设置其最小值和最大值,从而限制用户输入的范围
  • 步长设置:可以定义每次点击按钮或按键时值的变化量,即步长

效果演示

当单价和重量变化时,实时显示计算出的总价
spinbox

修改微调框数值的方式包括:

  • 单击右侧的向上/向下按钮
  • 按键盘的向上/向下键
  • 在微调框获取焦点时,通过鼠标滚轮的上下滚动
  • 当然了,也允许用户手动输入

其中,QSpinBox用于整数的显示和输入,QDoubleSpinBox用于浮点数的显示和输入
它们都是QAbstractSpinBox的子类,具有大多数相同的属性,只是参数类型不同(一个int,一个double

属性和方法

QSpinBox有很多属性,完整的可查看帮助文档。这里列出常用的属性和方法

2.1 值

微调框和值相关的属性包括:当前值、最大值、最小值

// 获取和设置当前值
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)

2.2 步长

步长是指按右侧上下调整按钮时的单步改变值,也就是按一次,增加或减少的值

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

2.3 循环

wrapping属性用于设置是否允许循环,比如范围设置为0-99

  • 当数值达到99时,再点击向上的按钮,此时数值会变为0
  • 当数值达到0时,再点击向下的按钮,此时数值会变为99
// 获取和设置是否允许循环
bool wrapping() const
void setWrapping(bool w)

2.4 加速

用于设置数值增加和减少的速度
如果设置为true,随着长按向上/向下箭头时间的增加,数值会加速增加/减少

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

2.5 前缀、后缀

用于设置微调框的前缀和后缀显示
比如,如果微调框中显示的是重量,可以添加一个KG的后缀,如果微调框中显示的是单价,可以添加一个$的前缀

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

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

2.6 信号槽

当微调框中的数值发生变化时,会发射valueChanged信号

void valueChanged(int i)

3. 从零实现

从零写代码实现整体效果,以演示微调框的属性以及信号槽的用法

3.1 布局

在UI设计师界面,拖拽对应的控件,修改显示的文字、控件的名称,然后完成布局

  • MyWidget窗口的Point Size属性修改为14
  • lblPricelblWeightsizePolicy->Horizontal Policy属性值修改为Fixed

布局完成效果如下:
qt-base

3.2 代码实现

首先,在mywidget.cpp的构造函数中,初始化控件,如下:

MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
    ui->setupUi(this);

    setWindowTitle("明王讲QT | 第二章 常用控件 | 2.8 微调框QSpinBox");

    // 1. 设置单价
    ui->spinPrice->setMinimum(1.00);        // 设置最小值
    ui->spinPrice->setMaximum(100.00);      // 设置最大值
    ui->spinPrice->setRange(1.00, 100.00);  // 同时设置最大最小值

    ui->spinPrice->setPrefix("$");        // 设置前缀
    ui->spinPrice->setSingleStep(0.5);    // 设置步长
    ui->spinPrice->setAccelerated(true);  // 设置加速
    ui->spinPrice->setWrapping(true);     // 设置循环

    // 2. 设置数量
    ui->spinWeight->setMaximum(300);
    ui->spinWeight->setMinimum(100);
    ui->spinWeight->setRange(100, 300);

    ui->spinWeight->setSuffix("KG");
    ui->spinWeight->setSingleStep(1);
    ui->spinWeight->setAccelerated(true);
    ui->spinWeight->setWrapping(true);
}

然后,在mywidget.h中声明槽函数,并在mywidget.cpp中实现,如下:

void MyWidget::on_spinPrice_valueChanged(double value) {
    double price = value;
    // double price = ui->spinPrice->value();
    int weight = ui->spinWeight->value();

    ui->lineEditTotal->setText(QString::number(price * weight));
}

void MyWidget::on_spinWeight_valueChanged(int value) {
    double price = ui->spinPrice->value();
    int weight = value;
    // int weight = ui->spinWeight->value();

    ui->lineEditTotal->setText(QString::number(price * weight));
}

4. 点赞、获取源码

看到这里的小伙伴,去B站给明王一个【免费的点赞】吧,你的支持,是我持续更新优质内容的动力,感谢~

源码下载地址
链接: https://pan.baidu.com/s/1pvI_TDDWXtKA4uYeUou1mg
提取码: ming