[Qt]常用控件介绍-输入类控件-QSpinBox、DateTimeEdit、Dial、Silder控件

发布于:2025-02-10 ⋅ 阅读:(72) ⋅ 点赞:(0)

目录

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);
}


网站公告

今日签到

点亮在社区的每一天
去签到