13.QT-DateTime Edit|Dial|Slider|日期盘算器|调整窗口透明度|调整窗口大小|自界说快捷键(C++) [复制链接]
发表于 2025-4-22 15:19:45 | 显示全部楼层 |阅读模式
Date Edit & Time Edit

使⽤ QDateEdit 作为⽇期的微调框.

使⽤ QTimeEdit 作为时间的微调框

使⽤ QDateTimeEdit 作为时间⽇期的微调框

这⼏个控件⽤法⾮常相似,我们以 QDateTimeEdit 为例进⾏介绍.
QDateTimeEdit 核⼼属性
属性说明dateTime时间⽇期的值.形如 2000/1/1 0:00:00date单纯⽇期的值.形如 2001/1/1time单纯时间的值.形如 0:00:00displayFormat时间⽇期格式.形如 yyyy/M/d H:mm
• y 表⽰年份
• M 表⽰⽉份
• d 表⽰⽇期
• H 表⽰⼩时
• m 表⽰分钟
• s 表⽰秒
注意:这⾥的格式化符号的含义,不要记忆.不同语⾔/库的设定规则
是存在差异的.⼀定是⽤的时间再去查.minimumDateTime最⼩时间⽇期maximumDateTime最⼤时间⽇期timeSpec• Qt:ocalTime :显⽰本地时间。
• Qt::UTC :显⽰协调世界时(UTC)。
• Qt::OffsetFromUTC :显⽰相对于UTC的偏移量(时差). 关于本地时间(LocalTime)和协调世界时(UTC)
UTC时间是⼀个基于原⼦钟的标准时间.不受地球的⾃转周期影响.和格林威治时间(GMT)是⾮常接近的.科学家会通过精密的装备来丈量并维护.
咱们的盘算机内部使⽤的时间就是基于UTC时间.
本地时间则是基于不同的时区,对UTC时间做出了⼀些调整.⽐如咱们使⽤的北京时间,位于"东⼋区",就需要在UTC时间基础上+8个⼩时的时差
核⼼信号
信号说明dateChanged(QDate)⽇期改变时触发.timeChanged(QTime)时间改变时触发.dateTimeChanged(QDateTi
me)时间⽇期恣意⼀个改变时触发. 代码⽰例:实现⽇期盘算器

1)在界⾯上创建两个 QDateTimeEdit 和⼀个按钮,⼀个label
QDateTimeEdit 的 objectName 为 dateTimeEdit_old 和 dateTimeEdit_new

2)编写盘算按钮的slot函数


  • 使⽤ daysTo 函数可以盘算两个⽇期的天数.
  • 使⽤ secsTo 函数可以盘算两个时间的秒数.
  • 通过 (秒数 / 3600) 换算成⼩时数,再余上24得到零⼏个⼩时.
  • 使⽤ QString::number 把整数转成 QString 进⾏拼接.
  1. void Widget::on_pushButton_clicked()
  2. {
  3.     //获取到两个输入框的时间
  4.     QDateTime timeOld = ui->dateTimeEdit->dateTime();
  5.     QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
  6.     qDebug() << timeOld << timeNew;
  7. }
复制代码

  1.     //计算日期的差值
  2.     int days = timeOld.daysTo(timeNew);
  3.     qDebug() << days;
复制代码

  1.     //计算日期的差值
  2.     int days = timeOld.daysTo(timeNew);
  3.     int seconds = timeOld.secsTo(timeNew);
  4.     //把秒数换算成小时
  5.     int hours = (seconds / 3600) % 24;
  6.     qDebug() << days << hours;
复制代码

  1. void Widget::on_pushButton_clicked()
  2. {
  3.     //获取到两个输入框的时间
  4.     QDateTime timeOld = ui->dateTimeEdit->dateTime();
  5.     QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
  6.     qDebug() << timeOld << timeNew;
  7.     //计算日期的差值
  8.     int days = timeOld.daysTo(timeNew);
  9.     int seconds = timeOld.secsTo(timeNew);
  10.     //把秒数换算成小时
  11.     int hours = (seconds / 3600) % 24;
  12.     //把结果放到label中
  13.     ui->label->setText(QString("时间持续了 ") + QString::number(days) + QString(" 天零 ") +
  14.                        QString::number(hours) + QString(" 小时"));
  15. }
复制代码

有bug,应该是7小时

  1. void Widget::on_pushButton_clicked()
  2. {
  3.     //获取到两个输入框的时间
  4.     QDateTime timeOld = ui->dateTimeEdit->dateTime();
  5.     QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
  6.     qDebug() << timeOld << timeNew;
  7.     //计算日期的差值
  8.     //int days = timeOld.daysTo(timeNew);
  9.     int seconds = timeOld.secsTo(timeNew);
  10.     //把秒数换算成小时
  11.     int hours = (seconds / 3600) % 24;
  12.     int days = (seconds / 3600) / 24;
  13.     //把结果放到label中
  14.     ui->label->setText(QString("时间持续了 ") + QString::number(days) + QString(" 天零 ") +
  15.                        QString::number(hours) + QString(" 小时"));
  16. }
复制代码
如果当前得到的小时数不足24,
由于此处是“整数除法",就会舍弃掉小数点后的内容得到的结果就是0了.

Dial

使⽤ QDial 表⽰⼀个旋钮.
有些程序,通过⿏标拖动旋钮旋转,即可完成⼀些相干的设置.

核⼼属性
属性说明value持有的数值.minimum最⼩值maximum最⼤值singleStep按下⽅向键的时间改变的步⻓.pageStep按下pageUp/pageDown的时间改变的步⻓.sliderPosition界⾯上旋钮显⽰的初始位置tracking外观是否会跟踪数值变化.
默认值为true.⼀般不需要修改.wrapping是否允许循环调整.
即数值如果凌驾最⼤值,是否允许回到最⼩值.
(调整过程可否"套圈")notchesVisible是否显⽰刻度线notchTarget刻度线之间的相对位置.
数字越⼤,刻度线越希奇. 核⼼信号
属性说明valueChanged(int)数值改变时触发rangeChanged(int, int)范围变化时触发 代码⽰例:调整窗⼝透明度

1)在界⾯上创建⼀个旋钮和⼀个label

初始值设置

或者用代码初始化
  1. Widget::Widget(QWidget *parent)  
  2.         : QWidget(parent)  
  3.         , ui(new Ui::Widget)  
  4. {  
  5.         ui->setupUi(this);  
  6.         // 设置可以循环旋转  
  7.         ui->dial->setWrapping(true);  
  8.         // 设置刻度线可⻅  
  9.         ui->dial->setNotchesVisible(true);  
  10.         // 设置最⼤值为  
  11.         ui->dial->setMaximum(100);  
  12.         // 设置最⼩值为  
  13.         ui->dial->setMinimum(0);  
  14.         // 设置初始值为  
  15.         ui->dial->setValue(100);  
  16. }
复制代码
3)编写widget.cpp,设置旋钮的 valueChanged slot函数
  1. void Widget::on_dial_valueChanged(int value)
  2. {
  3.     qDebug() << value;
  4.     ui->label->setText(QString("当前不透明度为: ") + QString::number(value));
  5.     this->setWindowOpacity((double)value / 100);
  6. }
复制代码

Slider

使⽤ QSlider 表⽰⼀个滑动条

QSlider 和 QDial 都是继续⾃ QAbstractSlider ,因此⽤法上基本相同.
核⼼属性
属性说明value持有的数值.minimum最⼩值maximum最⼤值singleStep按下⽅向键的时间改变的步⻓.pageStep按下pageUp/pageDown的时间改变的步⻓.sliderPosition滑动条显⽰的初始位置tracking外观是否会跟踪数值变化.
默认值为true.⼀般不需要修改.orientation滑动条的⽅向是⽔平还是垂直invertedAppearance是否要翻转滑动条的⽅向tickPosition刻度的位置.tickInterval刻度的密集程度. 核⼼信号
属性说明valueChanged(int)数值改变时触发rangeChanged(int, int)范围变化时触发 代码⽰例:调整窗⼝⼤⼩

1)在界⾯上创建两个滑动条,分别是⽔平和垂直滑动条.
objectName 分别为 horizontalSlider 和 verticalSlider

2)编写代码初始化滑动条
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.   
  4. Widget::Widget(QWidget *parent)
  5.     : QWidget(parent)
  6.     , ui(new Ui::Widget)
  7. {
  8.     ui->setupUi(this);
  9.   
  10.     ui->horizontalSlider->setMinimum(100);
  11.     ui->horizontalSlider->setMaximum(2000);
  12.     ui->horizontalSlider->setValue(800);
  13.     ui->horizontalSlider->setSingleStep(50);
  14.   
  15.     ui->verticalSlider->setMinimum(100);
  16.     ui->verticalSlider->setMaximum(1500);
  17.     ui->verticalSlider->setValue(600);
  18.     ui->verticalSlider->setSingleStep(50);
  19.     // 翻转朝向, 默认滑块从下向上增⻓, 改成从上往下增⻓.
  20.     ui->verticalSlider->setInvertedAppearance(true);
  21. }
复制代码
3)编写滑动条的 valueChanged slot函数
  1. void Widget::on_horizontalSlider_valueChanged(int value)
  2. {
  3.     const QRect& rect = this->geometry();
  4.     this->setGeometry(rect.x(), rect.y(), value, rect.height());
  5. }
  6.   
  7. void Widget::on_verticalSlider_valueChanged(int value)
  8. {
  9.     const QRect& rect = this->geometry();
  10.     this->setGeometry(rect.x(), rect.y(), rect.width(), value);
  11. }
复制代码
4)执⾏程序,可以看到调整滑动条,窗⼝⼤⼩就会随之改变.

代码⽰例:通过⾃界说快捷键调整滑动条位置

设置-减⼩value,设置=增加value.
默认环境下滑动条可以通过⽅向键或者pageUp/pageDown调整⼤⼩.
1)在界⾯上创建滑动条和label

2)编写初始化代码
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QShortcut>
  4.   
  5. Widget::Widget(QWidget *parent)
  6.     : QWidget(parent)
  7.     , ui(new Ui::Widget)
  8. {
  9.     ui->setupUi(this);
  10.   
  11.         ui->label->setText("");  
  12.         ui->horizontalSlider->setMinimum(0);  
  13.         ui->horizontalSlider->setMaximum(100);  
  14.         ui->horizontalSlider->setSingleStep(10);  
  15.         ui->horizontalSlider->setValue(0);
  16. }
复制代码
3)创建 valueChanged 的slot函数
  1. void Widget::on_horizontalSlider_valueChanged(int value)
  2. {
  3.     ui->label->setText("当前的值为: " + QString::number(value));
  4. }
复制代码
4)修改widget.cpp构造函数,增加速捷键


  • 使⽤ QShortCut 类设置快捷键.
  • 快捷键触发时,会发出 QShortcut::activated 信号,我们连接到⾃⼰写的slot函数.
  1.     //使用快捷键,需要QShortcut类
  2.     //需要两个快捷键,-用于减少,=用于增加
  3.     QShortcut* shortCut1 = new QShortcut(this);
  4.     shortCut1->setKey(QKeySequence("-"));
  5.   
  6.     QShortcut* shortCut2 = new QShortcut(this);
  7.     shortCut2->setKey(QKeySequence("="));
  8.   
  9.     //使用信号槽感知到快捷键被按下
  10.     connect(shortCut1, &QShortcut::activated, this, &Widget::subValue);
  11.     connect(shortCut2, &QShortcut::activated, this, &Widget::addValue);
复制代码
5)编写⾃界说slot函数
  1. void Widget::subValue()
  2. {
  3.     //获取当前的值
  4.     int value = ui->horizontalSlider->value();
  5.     if (value <= ui->horizontalSlider->minimum()) {
  6.         return;
  7.     }
  8.     ui->horizontalSlider->setValue(value - 5);
  9. }
  10.   
  11. void Widget::addValue()
  12. {
  13.     //获取当前的值
  14.     int value = ui->horizontalSlider->value();
  15.     if (value >= ui->horizontalSlider->maximum()) {
  16.         return;
  17.     }
  18.     ui->horizontalSlider->setValue(value + 5);
  19. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表