QSpinBox 和 QDoubleSpinBox 是常用的数值输入和输出组件,我们将它们统称为 SpinBox。 从 SpinBox 读取的数据就是数值(整数或浮点数), 设置数值就可以直接显示。QSpinBox 用于输入和输出整数,一般显示为十进制数,也可以按其他进制显示,而且可以设置显示的前缀和后缀。 QDoubleSpinBox 用于显示和输入浮点数,可以设置显示的小数位数,也可以设置显示的前缀和后缀。
一. QSpinBox 类和 QDoubleSpinBox 类
1.属性和接口函数
QSpinBox 和 QDoubleSpinBox 都是 QAbstractSpinBox 的子类,具有很多相同的属性,只是参数类型不同。在 Qt Designer 里进行 UI 可视化设计时就可以设置这些属性, 并能立刻看到显示效果。QSpinBox 和 QDoubleSpinBox 的主要属性如下表所示.
属性名称 | 功能 |
prefix | 数字显示的前缀,例如“$” |
suffix | 数字显示的后缀,例如“kg” |
buttonSymbols | 编辑框右侧调节按钮的符号,可以设置不显示调节按钮 |
text | 只读属性,SpinBox 里显示的全部文字,包括前缀和后缀 |
cleanText | 只读属性,不带前缀和后缀且去除了前后空格的文字 |
minimum | 数值范围的最小值 |
maximum | 数值范围的最大值 |
singleStep | 点击编辑框右侧上下调节按钮时的单步改变值,例如 1 或 0.1 |
stepType | 步长类型,单一步长或自适应步长 |
value | 当前显示的值 |
displayIntegerBase | QSpinBox 特有属性,显示整数使用的进制,例如 10 表示十进制 |
decimals | QDoubleSpinBox 特有属性,显示数值的小数位数,例如 2 表示显示两位小数 |
一个属性在类的接口中一般有一个读取函数和一个设置函数,例如 QSpinBox 的 value 属性对应的读取函数和设置函数的定义如下:
int QSpinBox::value() //读取数值
void QSpinBox::setValue(int val) //设置数值
从 Qt 5.12 开始,QSpinBox 和 QDoubleSpinBox 新增了一个 stepType 属性,表示步长变化的方式,属性值是枚举类型 QAbstractSpinBox::StepType,有两个枚举常量:
• QAbstractSpinBox::DefaultStepType:默认步长,也就是使用属性 singleStep 设置的固定步长。 • QAbstractSpinBox::AdaptiveDecimalStepType:自适应十进制步长,表示将自动连续调整步长值为 10n ,其中 n 为大于或等于 0 的整数。例如,value 属性值为 10 以下时,singleStep 属性值为 1;value 属性值为 100~999 时,singleStep 属性值为 10。
QSpinBox 类的接口函数主要是属性相关的读写函数,此外QSpinBox 还有一个函数 setRange(), 其函数原型定义如下,可同时设置最小值和最大值。
void QSpinBox::setRange(int minimum, int maximum)
2.信号
QSpinBox 有两个特有的信号,信号定义如下:
void QSpinBox::valueChanged(int i)
void QSpinBox::textChanged(const QString &text)
信号 valueChanged()在 value 属性值变化时被发射,传递的参数 i 是变化之后的数值。
信号 textChanged()在显示的文字发生变化时被发射,例如数值变化导致文字变化,prefix 或 suffix 属性变化导致文字变化。
二. 示例程序
创建一个 GUI 项目 samp4_04,选择窗口基类为 QWidget。UI 可 视化设计时界面如图所示:
“数值输入输出”分组框里放置了一个 QSpinBox 组件和两个QDoubleSpinBox 组件,给它们分别设置了前缀和后缀,QDoubleSpinBox组件的 decimals 属性设置为 2,也就是显示两位小数。
“进制转换”分组框里是 3 个 QSpinBox 组件,maximum 属性都设置为 65535,分别设置了前缀,设置 displayIntegerBase 属性值分别为 10、2 和 16,使它们用不同的进制显示数。显示十进制数的 QSpinBox 组件的 stepType 设置为 AdaptiveDecimalStepType,以测试自适应步长的效果。
Widget 类的构造函数以及标题为“计算”的按钮的槽函数代码如下:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->spinNum,SIGNAL(valueChanged(int)), this,SLOT(on_btnCal_clicked()));
connect(ui->spinPrice,SIGNAL(valueChanged(double)), this,SLOT(on_btnCal_clicked()));
}
void Widget::on_btnCal_clicked()
{//“计算”按钮
int num= ui->spinNum->value(); //读取数量,是整数
float price= ui->spinPrice->value(); //读取单价,是浮点数
float total= num*price;
ui->spinTotal->setValue(total); //直接显示浮点数
}
按钮 btnCal 的 clicked()信号的槽函数 on_btnCal_clicked()是用Go to slot对话框生成的。在Widget 的构造函数里,我们将 spinNum 和 spinPrice 的 valueChanged()信号与这个槽函数关联,这样,在界面上调整“数量”和“单价”这两个 SpinBox 的值时,就会运行槽函数 on_btnCal_clicked()。
对于“进制转换”分组框里的3个QSpinBox组件,使用Go to slot对话框为它们的valueChanged()信号创建槽函数。3 个 QSpinBox 组件的槽函数代码如下:
void Widget::on_spinDec_valueChanged(int arg1)
{//“十进制”SpinBox
qDebug(ui->spinDec->cleanText().toLocal8Bit().data()); //显示数值的十进制字符串
ui->spinBin->setValue(arg1); //设置整数,自动以二进制显示
ui->spinHex->setValue(arg1); //设置整数,自动以十六进制显示
}
void Widget::on_spinBin_valueChanged(int arg1)
{//“二进制”SpinBox
qDebug(ui->spinBin->cleanText().toLocal8Bit().data()); //显示数值的二进制字符串
ui->spinDec->setValue(arg1);
ui->spinHex->setValue(arg1);
}
void Widget::on_spinHex_valueChanged(int arg1)
{//“十六进制”SpinBox
qDebug(ui->spinHex->cleanText().toLocal8Bit().data()); //显示数值的十六进制字符串
ui->spinDec->setValue(arg1);
ui->spinBin->setValue(arg1);
}
为 QSpinBox 组件设置进制属性 displayIntegerBase 后,组件会将当前值自动以相应进制的字符串显示。使用函数 cleanText()可以返回数值的字符串,例如可以得到一个数的十六进制字符串。