(QT-UI)十四、在时间轴上绘制一段段时间片

   本系列预计实现

①刻度上方文字显示,

②时间轴拖动效果,

③时间轴刻度缩放,

④时间轴和其他控件联动显示,

⑤鼠标放置到时间轴,显示具体时间。

⑥通过定时器,实时更新时间轴

⑦时间轴上绘制时间片

 完整代码可见GitHub - 754816/QT_TimeLine: qt时间轴实现效果

1、基础思路

使用QPainter函数,根据时间片的起止时间,绘制矩形框。首先在外部类,获取对应的时间片,信息,通常为一个开始时间(QDateTime startTime)和一个结束时间(QDateTime endTime)为一组时间片,需要校验结束时间要比开始时间大才为正确的时间片,将时间片保存在容器(QVector)中。然后在绘制将单个时间片的开始时间,结束时间,分别转换为时间轴上的起止坐标,再构造成矩形框。最后调用painter.drawRects(vector);完成时间片的绘制

如图所示,这里绘制了今日08:00:00-10:35:00等四段时间片。

2、代码实现

首先构造时间片,定义结构体,然后填充四段时间片

//=========hpp=========
struct TimeInfo_t
{QDateTime beginTime;      //时间片开始时间QDateTime endTime;        //结束时间
};
QVector<TimeInfo_t> m_VodVec;//=========cpp=========
void MyTimeLine::InitializeUI()
{//预先构造今日的四段时间片QDate date = QDate::currentDate();TimeInfo_t tempInfo1;tempInfo1.beginTime = QDateTime(date, QTime(20,0,0));tempInfo1.endTime = QDateTime(date, QTime(22,0,0));TimeInfo_t tempInfo2;tempInfo2.beginTime = QDateTime(date, QTime(8,0,0));tempInfo2.endTime = QDateTime(date, QTime(10,35,0));TimeInfo_t tempInfo3;tempInfo3.beginTime = QDateTime(date, QTime(11,11,11));tempInfo3.endTime = QDateTime(date, QTime(12,34,56));TimeInfo_t tempInfo4;tempInfo4.beginTime = QDateTime(date, QTime(16,25,25));tempInfo4.endTime = QDateTime(date, QTime(16,26,26));m_VodVec = {tempInfo1, tempInfo2, tempInfo3, tempInfo4};
}

然后添加计算时间片的函数,将起止时间,转换为时间轴上的坐标。将传入的时间减去当前显示的时间(m_MoveDateTime),得到时间差t1,用时间差t1除以时间间隔(m_IntervalType),得到占有的时间比例,如当前时间间隔为1小时,t1为2小时,则计算出的ratio的值为2。再用ratio乘以每个时间间隔对应的像素宽度,得到相对于当前显示的时间的偏移像素。

QVector<QRect> MyTimeLine::CalVodRects()
{auto func_px = [&](QDateTime time){int px = 0;int mid =  this->size().width() / 2;//将传入的时间减去当前显示的时间(m_MoveDateTime),得到时间差t1qint64 t1 = time.toSecsSinceEpoch() - m_MoveDateTime.toSecsSinceEpoch();//用时间差t1除以时间间隔(m_IntervalType),得到占有的时间比例//如当前时间间隔为1小时,t1为2小时,则计算出的ratio的值为2double ratio = (double)t1 / (double)m_IntervalType;//再用ratio乘以每个时间间隔对应的像素宽度,得到相对于当前显示的时间的偏移像素px = ratio * m_blockWidth + this->size().width() / 2;return px;};int TimeLineHeight = this->size().height();QVector<QRect> VodRects;for(auto iter : m_VodVec){int begin = func_px(iter.beginTime);int end = func_px(iter.endTime) - begin;VodRects.push_back(QRect(begin, 0,  end, TimeLineHeight));//qDebug () << "begin:" << begin << "end:" << end;}return VodRects;
}

在这个过程中已经,实现了考虑时间轴的拖动和缩放,始终是计算相对于时间轴的当前时间的前后偏移情况。

最后在PaintEvent函数中,使用drawRects函数,添加绘制效果

void MyTimeLine::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;//设置为自定义的浅绿色 const QColor TransGreen = QColor(150, 220, 100, 80);//半透明绿色pen.setColor(TimeLineStyle::TransGreen);        QBrush brush1(TimeLineStyle::TransGreen);painter.setBrush(brush1);painter.setPen(pen);painter.drawRects(VodTimes);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

重发布实验

一、实验拓扑 二、实验需求 1.如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接 口&#xff0c;合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议&#xff0c;R4-R5-R6之间使用 RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络中出…

VScode | 我想推荐这些插件,好用

系列文章目录 本系列文章主要分享作位前端开发的工具之------VScode的使用分享。 VScode | 我的常用插件分享_vscode 别名跳转-CSDN博客 VScode | 我的常用代码片段&#xff0c;提升开发速度-CSDN博客 VScode | 我会设置文件夹右键用VScode打开_vscode右键打开文件夹-CSDN博…

如何使用ssm实现基于ssm的“游侠”旅游信息管理系统

TOC ssm190基于ssm的“游侠”旅游信息管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#x…

RocketMQ~刷盘机制、主从复制方式、存储机制

刷盘机制 生产者发布MQ给Brocker&#xff0c;Brocker在存储这些数据的时候&#xff0c;需要进行刷盘&#xff0c;分为同步刷盘和异步刷盘。 在同步刷盘中需要等待一个刷盘成功的ACK&#xff0c;同步刷盘对MQ消息可靠性来说是一种不错的保障&#xff0c;但是性能上会有较大影响…

GoWeb 设置别名和多环境配置

别名 vite.config.ts中添加代码如下即可 //设置别名resolve: {alias: {"": path.resolve(process.cwd(),"src"),//用替代src}}随后即可使用 配置多环境 vite.config.ts中添加代码如下 envDir: ./viteenv,//相对路径随后在项目根目录创建对应的viteenv…

【游戏速递】 小猪冲刺:萌动指尖的极速挑战,小虎鲸Scratch资源站独家献映!

在线玩&#xff1a;Scratch小猪冲刺&#xff1a;全新挑战的几何冒险游戏-小虎鲸Scratch资源站 想象一下&#xff0c;一群憨态可掬的小猪&#xff0c;穿上炫酷的装备&#xff0c;踏上了追逐梦想的赛道。它们或跳跃、或滑行&#xff0c;灵活躲避各种障碍&#xff0c;只为那终点的…

Web API 学习笔记 第四弹

1.时间戳 获取时间戳的方法①date.getTime()②new Date() 2.定时器 console.log(111)setTimeout(()>{console.log(222)},1000)console.log(333) console.log(111)setTimeout(()>{console.log(222)},0)console.log(333) 这两段代码打印结果分别是&#xff1f; 第一段 …

【STM32】驱动OLED屏

其实我没买OLED屏哈哈哈&#xff0c;这个只是学习了&#xff0c;没机会实践。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 显示原理 2 读写方式&#xff1a;8080并口 2.1 支持的指令类型 2.2 …

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点&#xff0c;Tesla的Full-Self Driving&#xff08;FSD&#xff09;系统凭借其持续的技术革新和强大的数据支持&#xff0c;在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史&#xff0c;从自动驾驶的基础概念入手&#…

数据结构-时间、空间复杂度-详解

数据结构-时间复杂度-详解 1.前言1.1数据结构与算法1.2如何衡量一个算法的好坏1.3复杂度 2.时间复杂度2.1是什么2.2大O符号只保留最高阶项不带系数常数次为O(1) 2.3示例示例2.1示例2.2示例2.3示例2.4 2.4题目 3.空间复杂度3.1是什么3.2大O符号3.3示例示例1示例2示例3示例4 4.题…

2024-08-26 更改驱动器号导致的软件崩溃问题

​ 在给电脑重新分盘时&#xff0c;想把 Software 盘的驱动器号&#xff08;E:&#xff09;改为对应的首字母 S&#xff0c;因此导致了所有软件崩溃。主要原因是软件主要依据驱动器号识别位置&#xff0c;而更改驱动器号后&#xff0c;并不会将软件设置的驱动器号一并更改。 ​…

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

车载通信框架--- 以太网重连Port口相关思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

手机mkv转换mp4:轻松实现视频格式兼容

如今手机已成为我们日常生活中不可或缺的伴侣&#xff0c;而视频文件则是我们享受娱乐、获取信息的重要来源。然而&#xff0c;由于不同设备和平台对视频格式的支持各有不同&#xff0c;我们有时会遇到无法在手机上播放某些视频文件的问题。 mkv是一种常见的视频格式&#xff…

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参&#xff0c;然后postman调用一直不成功&#xff0c;报错 使用RequestParam方式&#xff0c;如果postman 调用接口时报错required parameter XXX is not present 可能是&#xff08;value“items”&#xff09;跟你输…

A Neural Probabilistic Language Model

摘要 统计语言建模的一个目标是学习单词序列的联合概率函数。由于维度的诅咒&#xff0c;这在本质上是困难的:我们建议用它自己的武器来对抗它。在提出的方法中&#xff0c;人们同时学习(1)每个单词的分布式表示&#xff08;词向量&#xff09;(即单词之间的相似性)以及(2)表示…

在进行网站链接时,‌加上http或https的重要性不言而喻

这一简单的操作背后&#xff0c;‌蕴含着对搜索引擎优化&#xff08;‌SEO&#xff09;‌的深刻理解&#xff0c;‌以及对网站权重提升的精准把握。‌以下&#xff0c;‌我们将深入探讨这一话题&#xff0c;‌以期为您的网站优化提供有价值的参考。‌优化&#xff08;‌SEO&…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…