QSpinBox 和 QDoubleSpinBox

QSpinBox 和 QDoubleSpinBox 是常用的数值输入和输出组件,我们将它们统称为 SpinBox。 从 SpinBox 读取的数据就是数值(整数或浮点数), 设置数值就可以直接显示。QSpinBox 用于输入和输出整数,一般显示为十进制数,也可以按其他进制显示,而且可以设置显示的前缀和后缀。 QDoubleSpinBox 用于显示和输入浮点数,可以设置显示的小数位数,也可以设置显示的前缀和后缀。

一. QSpinBox 类和 QDoubleSpinBox 类

1.属性和接口函数

QSpinBox 和 QDoubleSpinBox 都是 QAbstractSpinBox 的子类,具有很多相同的属性,只是参数类型不同。在 Qt Designer 里进行 UI 可视化设计时就可以设置这些属性, 并能立刻看到显示效果。QSpinBox 和 QDoubleSpinBox 的主要属性如下表所示.

QSpinBox 和 QDoubleSpinBox 的主要属性
属性名称功能
prefix数字显示的前缀,例如“$”
suffix数字显示的后缀,例如“kg”
buttonSymbols编辑框右侧调节按钮的符号,可以设置不显示调节按钮
text只读属性,SpinBox 里显示的全部文字,包括前缀和后缀
cleanText只读属性,不带前缀和后缀且去除了前后空格的文字
minimum数值范围的最小值
maximum数值范围的最大值
singleStep点击编辑框右侧上下调节按钮时的单步改变值,例如 1 或 0.1
stepType步长类型,单一步长或自适应步长
value当前显示的值
displayIntegerBaseQSpinBox 特有属性,显示整数使用的进制,例如 10 表示十进制
decimalsQDoubleSpinBox 特有属性,显示数值的小数位数,例如 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()可以返回数值的字符串,例如可以得到一个数的十六进制字符串。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值