QSpinBox是Qt框架中用于整数数字输入和显示的控件,允许用户通过上下箭头按钮或直接键盘输入来调整数值
- 范围限制:可以设置其最小值和最大值,从而限制用户输入的范围
- 步长设置:可以定义每次点击按钮或按键时值的变化量,即步长
效果演示
当单价和重量变化时,实时显示计算出的总价
修改微调框数值的方式包括:
- 单击右侧的向上/向下按钮
- 按键盘的向上/向下键
- 在微调框获取焦点时,通过鼠标滚轮的上下滚动
- 当然了,也允许用户手动输入
其中,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 - 将
lblPrice和lblWeight的sizePolicy->Horizontal Policy属性值修改为Fixed
布局完成效果如下:
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







