[Qt]常用控件介绍-输入类控件-QSpinBox、DateTimeEdit、Dial、Silder控件
目录
1.Spin Box控件
属性
核心信号
Demo:点餐小程序
2.DateEdit & TimeEdit & DateTimeEdit
属性
核心信号
UTC协调世界时
Demo:计算两个日期的差值
3.Dial控件
属性
核心信号
Demo:旋钮控制界面的透明度
4.Silder控件
属性
核心信号
Demo:滑动条调整窗口大小-绑定快捷键
1.Spin Box控件
QSpinBox和QDoubleSpinBox都是一个带有按钮的输入框,也可以说是微调框,可以输入的整数或者浮点数,并使用按钮来调整数值的大小。
属性
属性 | 说明 |
value | 存储的数值 |
singleStep | 每次调整的数据变化值 |
displayInteger | 数字的进制形式(二进制数据、十进制数据等) |
minimum | 最小值 |
maximum | 最大值 |
suffix | 后缀(例如数据为第n个,那么这个后缀就是”个“) |
prefix | 前缀 |
wrapping | 是否允许换行 |
frame | 是否带边框 |
alignment | 文字对齐方式 |
readOnly | 是否允许修改 |
buttonSymbol | 按钮上的图标 UpDownArrows上下箭头形式 PlusMinus加减号形式 NoBUttons没有按钮 |
accelerated | 按下按钮时是否快速调整模式 |
correctionMode | 输入的时候有错误修正的修正方案 QAbstractSpinBox::CorrectToPreviousValue如果用户输入了一个无效的值,那么SpinBox会恢复为上一个有效值 QAbstractSpinBox::CorrectToNearestValue输入错误的时候SpinBox会恢复为最接近的有效值 |
keyboardTrack | 是否开启键盘跟踪 开启的话,每次输入一个数字,都会触发一次下面的两个信号。 如果不开启的话,只有最终按下enter或输入框失去焦点的时候,才会触发下面的两个信号 |
核心信号
信号 | 说明 |
textChanged(QString) | 参数时带有前缀后缀的QString字符串,触发情况是上述所说 |
valueChanged(int) | 参数int是value数值 |
Demo:点餐小程序
//设置为条框的范围
void setRange(int min, int max);
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//编辑下拉框选项内容
ui->comboBox->addItem("米饭");
ui->comboBox->addItem("面条");
ui->comboBox_2->addItem("豆角");
ui->comboBox_2->addItem("排骨");
//修改SpinBox的范围属性
ui->spinBox->setRange(1, 5);
ui->spinBox_2->setRange(1, 2);
//设置默认值
ui->spinBox->setValue(1);
ui->spinBox_2->setValue(1);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
qDebug() << "选中的内容是: "
<< ui->comboBox->currentText() << ":" << ui->spinBox->value()
<< ui->comboBox_2->currentText() << ":" << ui->spinBox_2->value();
}
2.DateEdit & TimeEdit & DateTimeEdit
这三个控件是基于微调框的,用来调整时间和日期的微调框。这几个控件十分相似,这里我们介绍QDateTimeEdit。
属性
属性 | 说明 |
dateTime | 时间日期的值,xx/xx/xx 0:0:0的格式 |
date | 日期的值 |
time | 时间的值 |
displayFormat | 通过一些特殊大的字符来表述时间日期的格式 例如:yyyy/M/d H:mm 年份为4位数,月份为1位,日期为1位,用/分割,具体什么字母表示什么不用记,因为不同的系统是不一样的。 |
minimumDateTime | 最小日期时间 |
maximumDateTime | 最大日期时间 |
timeSpec | Qt::LocalTime显示本地时间 Qt::UTC显示协调世界时 Qt::OffsetFromUTC显示相对对UTC的偏移量 |
核心信号
信号 | 说明 |
dateChanged(QDate) | 日期改变的时候触发 |
timeChanged(QTime) | 时间改变的时候触发 |
dateTimeChanged(QDateTime) | 时间或日期任意一个改变的时候触发 |
UTC协调世界时
UTC是一个基于原子钟的标准时间,不受地球自转周期的影响,咱们计算机内部使用的时间就是基于UTC时间。而本地时间是基于不同的时区的,每个时区都不一样,我们所在的是东八区,所以要在UTC时间的基础上+8h。
Demo:计算两个日期的差值
// 计算两个日期的天数差值
qint64 daysTo(const QDateTime &) const;
// 计算两个日期的秒数差值
qint64 secsTo(const QDateTime &) const;
对于daysTo、secsTo的调用是,传递的参数减去调用的对象。
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//首先要获取到两个时间都是什么
QDateTime timeOld = ui->dateTimeEdit->dateTime();
QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
//计算差值
int days = timeOld.daysTo(timeNew);
int hours = (timeOld.secsTo(timeNew) / 3600) % 24;
//转换成字符串
QString text = QString("时间已经持续了:") + QString::number(days) + QString("天 ")
+ QString::number(hours) + QString("小时");
ui->label_3->setText(text);
}
3.Dial控件
表示一个旋钮的控件
属性
属性 | 说明 |
value | 持有的数值 |
minimum | 最小值 |
maximum | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下pageUp/pageDown的时候改变的步长 |
sliderPosition | 界面上旋钮显示的初始位置 |
tracking | 外观是否会跟踪数值的变化,默认位true,一般不用改变 |
wrapping | 是否允许循环调整,数值变为最大值后是否回到最小值 |
notchesVisible | 是否显示刻度线 |
notchTarget | 刻度线之间的相对位置,数字越大刻度线就月稀疏 |
核心信号
信号 | 说明 |
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围变化时触发 |
Demo:旋钮控制界面的透明度
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置可以循环旋转
ui->dial->setWrapping(true);
//设置范围
ui->dial->setRange(0, 100);
//设置刻度线可见
ui->dial->setNotchesVisible(true);
//设置初始值为100
ui->dial->setValue(100);
}
Widget::~Widget()
{
delete ui;
}
//旋钮数值发生改变触发的信号对于的槽函数
void Widget::on_dial_valueChanged(int value)
{
ui->label->setText(QString("当前不透明度为:") + QString::number(value));
this->setWindowOpacity((double)value / 100);
}
4.Silder控件
是一个滑动条的控件,QSilder和QDial都是继承于QAbstractSlider,所以用法上看基本一样。
属性
属性 | 说明 |
value | 持有的数值 |
minimum | 最小值 |
maximum | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下pageUp/pageDown的时候改变的步长 |
sliderPosition | 界面上旋钮显示的初始位置 |
tracking | 外观是否会跟踪数值的变化,默认位true,一般不用改变 |
orientation | 滑动条的方向是水平还是竖直的 |
invertedAppearance | 是否要反转滑动条的方向 |
tickPosition | 刻度的位置 |
tickInterval | 可读的密集程度 |
核心信号
信号 | 说明 |
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围变化时触发 |
Demo:滑动条调整窗口大小-绑定快捷键
代码的逻辑在于:用户可以手动拉动进度条来触发信号改变窗口的大小,也可以使用绑定好的快捷键,快捷键会绑定槽函数,一旦输入的内容被解析为快捷键就会触发QShortcut中的activated信号,进而触发槽函数,我们在槽函数内在去改变进度条的大小,就又会触发信号,进而改变窗口的大小。
对于快捷键的设置为什么在QPushButton的时候,不需要创建QShortcut对象,进行信号槽的绑定和实现槽函数呢?因为按钮的快捷键设置是按钮类内部提供的setShortcut函数接口,他内部会帮我们处理上述问题,而且对于按钮的快捷键设置就是触发按钮,所以没有异议可以写死。但是对于进度条他分很多种情况,增加减少,增加多少?减少多少?所以没有提供接口,如果我们需要的话需要自己去实现快捷键的生成和绑定对于的槽函数。
QShortcut类就是自定义快捷键的类,触发快捷键后,会触发QShortcut中的activated信号。
#include "widget.h"
#include "ui_widget.h"
#include <QShortcut>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置窗口的初始大小
QRect rect = this->geometry();
this->setGeometry(rect.x(), rect.y(), 500, 500);
//设置滑动条的范围和初始值
ui->horizontalSlider->setRange(200, 2000);
ui->horizontalSlider->setValue(500);
//设置步长
ui->horizontalSlider->setSingleStep(50);
//创建快捷键对象
QShortcut* shortCut_up = new QShortcut(this);
QShortcut* shortCut_down = new QShortcut(this);
//添加快捷键
shortCut_up->setKey(QKeySequence("="));
shortCut_down->setKey(QKeySequence("-"));
//使用信号槽,感知到快捷键被按下执行槽函数
connect(shortCut_up, &QShortcut::activated, this, &Widget::addValue);
connect(shortCut_down, &QShortcut::activated, this, &Widget::subValue);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_horizontalSlider_valueChanged(int value)
{
ui->label->setText(QString("当前值为:") + QString::number(value));
QRect rect = this->geometry();
this->setGeometry(rect.x(), rect.y(), value, value);
}
//增加函数
void Widget::addValue()
{
//获取滑动条的value值
int value = ui->horizontalSlider->value();
ui->horizontalSlider->setValue(value + 50);
}
//减少函数
void Widget::subValue()
{
//获取滑动条的value值
int value = ui->horizontalSlider->value();
ui->horizontalSlider->setValue(value - 50);
}