2.8.7 QSpinBox 数值输入框
QSpinBox类是数值输入框,和它类似的有QDoubleSpinBox,QTimeEdit,QDateEdit,QDateTimeEdit。它们的功能都很类似,小豆君在这里就只介绍QSpinBox,其它的可查看帮助文档。
这个自旋框支持整数值,但可以扩展为使用validate()、textFromValue()和valueFromText()的不同字符串。
除了数值范围之外,通常还需要给用户一个特殊的(通常是默认的)选择。请参见setSpecialValueText(),了解如何使用QSpinBox实现此功能。
下面我们来看它的属性
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到界面。
新建一个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,点击添加,提升。
编译运行程序,点击增加/减少按钮,在spingBox中输入1-7或一到七,然后回车,看有什么变化。
本例中还不完善,如果输入相应的数字,就会显示对应的星期,但是如果输入“星期三”,则不会显示,想想这该如何完善。
提示:函数执行顺序:
validate()验证输入。在这里面可以使用正则表达式来判断。
valueFromText()将输入的文字转化为数字。
textFromValue()将数字转化为真正想要显示的字符串,供显示。
好了,关于QSpinBox的内容今天先讲到这里。
想要第一时间看到小豆君的更新,请关注微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。