当前位置: 首页 > article >正文

Qt|实现时间选择小功能

在软件开发过程中,QtDesigner系统给出的控件很多时候都无法满足炫酷的效果,前一段时间需要用Qt实现选择时间的小功能,今天为大家分享一下!

首先看一下时间效果吧!

如果有需要继续往下看下去哟~

功能

1:开发环境

win10环境下,VS2017 + Qt5.14.2

2:实现功能用到的重点功能

单个时间widget类名:QSingleSelectTimeWidget

2.1:获取实时时间。

既然想要改变时间,必须要有一个时间,在Demo中默认选用当前系统时间

QTime currentTime = QTime::currentTime();
QString qsCurrentTime = currentTime.toString("hh:mm:ss");
ui.labShowContent->setText(qsCurrentTime);

默认将数据展示到静态文本上,效果如图:

在响应“选择时间”按钮时,将实时时间传入widget中,作为初始值。

2.2:时间窗口设置。

看GIF效果,可以得出,小时数据、分钟数据、秒数据所用的效果都是一致的,那么,可以创建一个通用类,在内容进行小时、分钟、秒针区分。

设置枚举类型:

enum ENUM_TimeMode
{
	TimeMode_Hour, //小时
	TimeMode_Minute, //分钟
	TimeMode_Second, //秒钟
};

小时对应的时间范围:【0,14)

分钟、秒数对应的时间范围:【0,60)

实现核心代码,如下

void QSingleSelectTimeWidget::SetTimeChange(ENUM_TimeMode enumTime, int data)
{
	switch (enumTime)
	{
	case QSingleSelectTimeWidget::TimeMode_Hour: //小时制度
	{
		//区间范围:[0-24)

		//设置:当前时间
		ui.labCurrent->setText(QString::number(data));
		//设置:上一个时间
		int nPreviousData = data == 0 ? 23 : (data - 1);
		ui.labPrevious->setText(QString::number(nPreviousData));
		//设置:下一个时间
		int nNextData = data == 23 ? 0 : (data + 1);
		ui.labNext->setText(QString::number(nNextData));
	}
	break;
	case QSingleSelectTimeWidget::TimeMode_Minute: //分钟制度
	case QSingleSelectTimeWidget::TimeMode_Second: //秒制度
	{
		//区间范围:[0-60)

		//设置:当前时间
		ui.labCurrent->setText(QString::number(data));
		//设置:上一个时间
		int nPreviousData = data == 0 ? 59 : (data - 1);
		ui.labPrevious->setText(QString::number(nPreviousData));
		//设置:下一个时间
		int nNextData = data == 59 ? 0 : (data + 1);
		ui.labNext->setText(QString::number(nNextData));
	}
	break;
	}
}

代码解析:

参数1(ENUM_TimeMode):表示需要变动的类型,因为三个类型用一个类表示。

参数2(int):该参数的数值代表了正在显示的时间。如图所示:

每次改变中间的数值,对应的上一个数值、下一个数据也随着变化。

2.3:滚轮事件实时更新时间展示。

随着鼠标滚轮的变化,对应的时间也会随着变化。实现代码:

void QSingleSelectTimeWidget::wheelEvent(QWheelEvent *event)
{
	QPoint ptDegrees = event->angleDelta();
	//当前 ptDegrees.y 大于0,滚轮放大,反之缩小
	if (ptDegrees.y() > 0)
	{
		//滚轮向上
		this->OnBnClickedUp();
	}
	else
	{
		//滚轮向下
		this->OnBnClickedDown();
	}
	QWidget::wheelEvent(event);
}

2.4:响应数据减小变动

void QSingleSelectTimeWidget::OnBnClickedUp()
{
	//当前数值向上移动-1,获取上一个展示label的数值
	int nPreviousData = ui.labPrevious->text().toInt();
	m_nCurrentData = nPreviousData;
	//重新设置数据变化
	this->SetTimeChange(m_enumTime, m_nCurrentData);
}

2.5:响应数据增大变动

void QSingleSelectTimeWidget::OnBnClickedDown()
{
	//当前数值向上移动-1,获取下一个展示label的数值
	int nNextData = ui.labNext->text().toInt();
	m_nCurrentData = nNextData;
	//重新设置数据变化
	this->SetTimeChange(m_enumTime, m_nCurrentData);
}

3:创建整体日期选择创建以及功能设置

3.1:创建时分秒widget

.h中声明

QSingleSelectTimeWidget* m_widgetHour; //时
QSingleSelectTimeWidget* m_widgetMinute; //分
QSingleSelectTimeWidget* m_widgetSecond; //秒

.cpp中应用

//<widget>时
m_widgetHour = new QSingleSelectTimeWidget(this);
m_widgetHour->setGeometry(20, 30, 60, 200);
m_widgetHour->show();
//<widget>分
m_widgetMinute = new QSingleSelectTimeWidget(this);
m_widgetMinute->setGeometry(80, 30, 60, 200);
m_widgetMinute->show();
//<widget>秒
m_widgetSecond = new QSingleSelectTimeWidget(this);
m_widgetSecond->setGeometry(140, 30, 60, 200);
m_widgetSecond->show();

3.2:根据外部接口传入的时间分别设置时分秒具体数据

void QChildCaseTimeWidget::SetSelectNewCalendarTime(QString qsCurrentTime)
{
	//对传入的时间进行分割
	QStringList listTime = qsCurrentTime.split(":");
	if (listTime.size() < 3)
	{
		return; //时间格式不对,不处理
	}
	//设置:小时
	QString qsHour = listTime[0];
	m_widgetHour->SetCurrentShowTime(QSingleSelectTimeWidget::TimeMode_Hour, qsHour.toInt());
	//设置:分钟
	QString qsMinute = listTime[1];
	m_widgetMinute->SetCurrentShowTime(QSingleSelectTimeWidget::TimeMode_Minute, qsMinute.toInt());
	//设置:秒钟
	QString qsSecond = listTime[2];
	m_widgetSecond->SetCurrentShowTime(QSingleSelectTimeWidget::TimeMode_Second, qsSecond.toInt());
}

3.3:点击“确认”按钮发送完整新时间

void QChildCaseTimeWidget::OnBnClickedOK()
{
	//组装数据进行发送
	int nHour = m_widgetHour->GetCurrentContent();
	int nMinute = m_widgetMinute->GetCurrentContent();
	int nSecond = m_widgetSecond->GetCurrentContent();
	QString qsGroup = QString::number(nHour).rightJustified(2, '0') + QStringLiteral(":") + QString::number(nMinute).rightJustified(2, '0') + QStringLiteral(":") + QString::number(nSecond).rightJustified(2, '0');
	emit Msg_SendNewCalendarTime(qsGroup);
	QWidget::close();
}

外界调用时,只需要响应Msg_SendNewCalendarTime信号就可以更新展示时间了

今天的功能就更新到这里喽,有需要源码的同学,exe的打包环境已经配置完成,直接可以运行哟~

可以点击下面链接进行下载:

Qt中实现自定义时间选择功能icon-default.png?t=N7T8https://download.csdn.net/download/qq_32716885/88807282

我是糯诺诺米团,一名C++开发程序媛~


http://www.kler.cn/a/229771.html

相关文章:

  • ref用法
  • Llama2大模型开源,大模型的Android时代来了?
  • 如何更改默认浏览器?
  • 2024-02-01(Hive)
  • java -jar启动SpringBoot项目时配置文件加载位置与优先级
  • Python学习路线 - Python高阶技巧 - 拓展
  • QT 应用程序中集成浏览器
  • MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建
  • 【Jenkins】配置及使用|参数化|邮件|源码|报表|乱码
  • 已解决org.springframework.context.ApplicationContextException异常的正确解决方法,亲测有效!!!
  • 安全通信设置:使用 OpenSSL 为 Logstash 和 Filebeat 提供 SSL 证书
  • 编程笔记 html5cssjs 081 JavaScript 异常处理语句
  • 安卓SurfaceTexture中updateTexImage使用及源码分析
  • 二叉树的详解
  • 百面嵌入式专栏(面试题)驱动开发面试题汇总1.0
  • 什么是边缘计算?
  • 米贸搜|关于Facebook广告受限:在这些情况下,Meta会限制广告主的广告能力!
  • 敏捷开发和传统开发的区别及工具分享
  • Flink 动态表 (Dynamic Table) 解读
  • CKS1.28【1】kube-bench 修复不安全项