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++开发程序媛~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 05重定向和管道管理

01.重定向 例子&#xff1a; 关键字 > date 中的数据要写入 887.txt 02.FD 进程的句柄文件 进程的信息的传输&#xff1a; porcess 会有 0 号文件来接收键盘的信息 1 号文件 向终端 来输出信息 FD文件存储在proc文件中&#xff0c;可以看看 举个例子&#xff1a; 查看pro…

计算机网络原理基础

目录 前言&#xff1a; 1.网络发展史 2.网络通信基础 2.1IP地址 2.1.1定义 2.1.2格式 2.2端口号 2.2.1定义 2.2.2格式 2.3协议 2.3.1定义 2.3.2作用 2.3.3分层 2.4五元组 2.4.1定义 2.4.2组成 3.TCP/IP五层网络模型 3.1模型概念 3.2模型构成 3.3网络分层对应…

docker-compose部署laravel项目实战(主机nginx连接项目容器)(详细配置过程)

我用的是主机上的nginx,没有用docker安装nginx&#xff0c; 所以需要先在主机上安装nginx # 更新系统yum sudo yum update# 安装安装包sudo yum install epel-release sudo yum install wget# 安装Nginx sudo yum install nginx #启动 sudo systemctl start nginx #开机自启动…

C语言笔试题之反转链表(头插法)

实例要求&#xff1a; 1、给定单链表的头节点 head &#xff1b;2、请反转链表&#xff1b;3、最后返回反转后的链表&#xff1b; 案例展示&#xff1a; 实例分析&#xff1a; 1、入参合理性检查&#xff0c;即head ! NULL || head->next ! NULL&#xff1b;2、while循环…

Vue3中使用element-plus菜单折叠后文字不消失

今天使用element-plus中国的导航菜单时&#xff0c;发现菜单栏折叠起来时文字不会自动消失&#xff0c;因为element-plus中内置了菜单折叠文字自动消失的&#xff0c;使用collapsetrue/false即可&#xff0c;但在实际使用中出现了一下问题&#xff1a; 折叠以后文字并没有消失&…

普通编程,机器学习与深度学习

普通编程&#xff1a;基于人手动设置规则&#xff0c;由输入产生输出经典机器学习&#xff1a;人手工指定需要的特征&#xff0c;通过一些数学原理对特征与输出的匹配模式进行学习&#xff0c;也就是更新相应的参数&#xff0c;从而使数学表达式能够更好的根据给定的特征得到准…

vue2父组件向子组件传值时,子组件同时接收多个数据类型,控制台报警的问题

最近项目遇到一个问题,就是我的父组件向子组件(公共组件)传值时,子组件同时接收多个数据类型,控制台报警的问题,如下图,子组件明明写了可同时接收字符串,整型和布尔值,但控制台依旧报警: 仔细检查父组件,发现父组件是这样写的: <common-tabletooltip :content=…

Vue3开发环境搭建和工程结构(一)

一、NVM和Node.js安装 NVM 是 Node Version Manager&#xff08;Node 版本管理工具&#xff09;的缩写&#xff0c;是一个命令行工具&#xff0c;用于管理和切换到不同版本的 Node.js。 1、前往 nvm-windows 仓库&#xff0c;然后单击立即下载 2、下载最新版本 3 、按照安装向…

【数据结构与算法】之排序系列-20240204

这里写目录标题 一、977. 有序数组的平方二、1051. 高度检查器三、1122. 数组的相对排序四、1200. 最小绝对差五、1331. 数组序号转换 一、977. 有序数组的平方 简单 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求…

rsync-3.1.2下载编译安装运行同步

下载 https://rsync.samba.org/ftp/rsync/src/ 解压 -解压源码包tar -xvf rsync-3.1.2.tar.gz -重命名mv rsync-3.1.2 rsync -将软件安装到指定目录下./configure --prefi/usr -编译 make - 安装 make install 安装之后启动脚本在/usr/bin/ -启动脚本 (启动之前需要配置一下…

BridgeTower:融合视觉和文本信息的多层语义信息,主打复杂视觉-语言任务

BridgeTower 核心思想子问题1&#xff1a;双塔架构的局限性子问题2&#xff1a;不同层次的语义信息未被充分利用子问题3&#xff1a;模型扩展性和泛化能力 核心思想 论文&#xff1a;https://arxiv.org/pdf/2206.08657.pdf 代码&#xff1a;https://github.com/microsoft/Bri…

MATLAB时域分析(附完整代码)

时域分析是一种分析信号或系统在时间维度下的行为或特性的方法。在时域分析中&#xff0c;信号或系统的状态是随时间变化的&#xff0c;这是最直观的分析方法。例如&#xff0c;一个音频信号在时域中可能会显示为波形随时间的变化。 在系统分析中&#xff0c;尤其是在电路分析…

LeetCode、216. 组合总和 III【中等,组合型枚举】

文章目录 前言LeetCode、216. 组合总和 III【中等&#xff0c;组合型枚举】题目类型与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖…

MATLAB | 绘图复刻(十四) | 右侧对齐桑基图,及工具函数SSankey更新

hey 真的好久不见了&#xff0c;本期既是一期绘图复刻教程&#xff0c;也是我写的工具函数的版本更新&#xff0c;本期复刻的图片来自《Nature》&#xff1a; Elmarakeby, H.A., Hwang, J., Arafeh, R. et al. Biologically informed deep neural network for prostate cancer…

构建互联网医院系统:数字化医疗的代码之旅

在互联网时代&#xff0c;医疗服务也在逐步数字化&#xff0c;而构建一个互联网医院系统成为了医疗领域的一项创新。在这篇文章中&#xff0c;我们将探讨如何通过技术代码构建一个基础的互联网医院系统&#xff0c;为患者和医生提供便捷、高效的医疗服务。 1. 环境搭建与前端…

ES6中新增Array.from()函数的用法详解

目录 Map对象的转换 Set对象的转换 字符串的转换 类数组对象的转换 Array.from可以接受三个参数 ES6为Array增加了from函数用来将其他对象转换成数组。当然&#xff0c;其他对象也是有要求&#xff0c;也不是所有的&#xff0c;可以将两种对象转换成数组。 1、部署了Iter…

【BIAI】Lecture 13 - Language processing

Language processing 专业术语 Aphasia 失语症 fMRI 功能性磁共振成像 auditory cortex 听觉皮层 motor cortex 运动皮层 primary visual cortex 初级视觉皮层 permotor cortex 前运动皮层 课程概要 What is language 语言是一种用词汇按照语法规则组合来表示和交流信息的系统…

将.sqlite文件转化为.sql文件并存入mysql数据库

场景描述 今天在处理Bird数据&#xff0c;里面都是.sqlite格式的文件&#xff0c;我需要把这些文件都存到mysql数据库里面。具体的流程如下。 1、.sqlite转化为.sql 在当前目录下打开终端 sqlite3 movie_platform.sqlite .dump > movie_platform.sql2、存入mysql 在 MyS…

Spring Data Envers 数据审计实战2 - 自定义监听程序扩展审计字段及字段值

上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计&#xff0c;那么如果我们想扩展审计字段呢&#xff1f; 比如目前对员工表加入了Audited审计&#xff0c;员工表有个字段为dept_id&#xff0c;为…

第16届大广赛命题详情它来啦!

“中国大学生创造力”全国大学生广告艺术竞赛&#xff08;以下简称&#xff1a;广播竞赛&#xff09;作为高水平三维生产教育一体化、科学教育一体化竞争平台&#xff0c;坚持高地位&#xff0c;基于大模式&#xff0c;在19年的发展过程中&#xff0c;坚持道德培养人才的基础&a…