2.8.7 QSpinBox 数值输入框
QSpinBox类是数值输入框,和它类似的有QDoubleSpinBox,QTimeEdit,QDateEdit,QDateTimeEdit。它们的功能都很类似,小豆君在这里就只介绍QSpinBox,其它的可查看帮助文档。
这个自旋框支持整数值,但可以扩展为使用validate()、textFromValue()和valueFromText()的不同字符串。
除了数值范围之外,通常还需要给用户一个特殊的(通常是默认的)选择。请参见setSpecialValueText(),了解如何使用QSpinBox实现此功能。
下面我们来看它的属性
![](https://img.haomeiwen.com/i3988606/f9a0e21b59400647.png)
1 value:当前数值。
- QSpinBox允许用户通过点击up/down按钮或按下键盘上的上下键来选择一个值,以增加/减少当前显示的值。用户还可以手动输入值。
- 每次值改变QSpinBox时,都会发出两个valueChanged()信号,一个提供int,另一个提供QString。
2 singleStep:单步变化值;maximum:最大值;maximum:最小值。
- 单击up / down按钮,或者使用键盘加速器的上下箭头,将增加或减少当前singleStep()步的值。可以使用一个构造函数来设置最小值,最大值和步长,并且可以稍后使用setMinimum()、setMaximum()和setSingleStep()来更改。默认是1。
- QSpinBox也可以作为一个循环操作,即如果范围是0 - 99,而当前的值是99且wrapping()设置为真,点击“up”将会给出0。
3 prefix,suffix:前后缀;cleanText :不包含前后缀的字符串。
- 还可以为输入的值设置前后缀。
- text()用来显示完整字符串(包括任何前缀和后缀)
- 使用cleanText()可以获得不带前缀或后缀的字符串。
4 displayInterBase:显示displayInterBase进制数。例如,2进制,16进制等。
2.8.8 示例
本示例做一个可以显示星期的spinBox,当你按上/下键时,spinBox可以显示星期一到星期日。
在原有的InputWidget的ui界面中继续添加一页,标签为QSpinBox,并且拖一个QSpinBox到界面。
![](https://img.haomeiwen.com/i3988606/9c5edde3774b708c.png)
新建一个C++类WeekSpinBox,继承QSpinBox
weekspinbox.h
#ifndef WEEKSPINBOX_H
#define WEEKSPINBOX_H
#include <QSpinBox>
class WeekSpinBox : public QSpinBox
{
public:
WeekSpinBox(QWidget* parent = 0);
protected:
QValidator::State validate(QString &input, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int val) const;
};
#endif // WEEKSPINBOX_H
weekspinbox.cpp
#include <QDebug>
#include "weekspinbox.h"
WeekSpinBox::WeekSpinBox(QWidget* parent):
QSpinBox(parent)
{
//一星期有七天,所以设置为1-7
setMinimum(1);
setMaximum(7);
//设置可以循环,如果当前为星期日,则点击增加按钮,则会变成星期一
setWrapping(true);
}
//验证器
//当你输入完按回车时,此函数用于验证输入的内容是否为所需要的内容。
//例如本例,当只有输入[一二三四五六七]时,才会接受。
QValidator::State WeekSpinBox::validate(QString &input, int &pos) const
{
/*enum State {
Invalid,//已经输入完毕(按回车),如果input不符合要求,则返回该值
Intermediate,//还没输入完毕,但当前所输入的内容是符合要求的,则返回该值
Acceptable//已经输入完毕,并符合要求,返回该值。
};*/
int value = valueFromText(input);
if (value >= 1 && value <= 7)
{
return QValidator::Acceptable;
}
return QValidator::Invalid;
}
//如果需要将输入的文本解释为值时,就重新实现该函数。
int WeekSpinBox::valueFromText(const QString &text) const
{
int index = tr("1234567一二三四五六七").indexOf(text);
return index%7+1;
}
//如果需要将数字转化为文本,就重新实现该函数。
QString WeekSpinBox::textFromValue(int value) const
{
QString txt = tr("一二三四五六天");
return tr("星期%1").arg(txt.at(value-1));
}
再切换到ui界面,右击QSpinBox,选择提升为,这时弹出提升对话框,填入提升的类名WeekSpinBox,点击添加,提升。
![](https://img.haomeiwen.com/i3988606/a0e340c2155a54c7.png)
编译运行程序,点击增加/减少按钮,在spingBox中输入1-7或一到七,然后回车,看有什么变化。
本例中还不完善,如果输入相应的数字,就会显示对应的星期,但是如果输入“星期三”,则不会显示,想想这该如何完善。
提示:函数执行顺序:
validate()验证输入。在这里面可以使用正则表达式来判断。
valueFromText()将输入的文字转化为数字。
textFromValue()将数字转化为真正想要显示的字符串,供显示。
好了,关于QSpinBox的内容今天先讲到这里。
想要更多干货,请关注微信公众号:小豆君,只要关注,便可加入我的C++\Qt交流群一起学习。
网友评论