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

(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.mrgr.cn/news/6068.html

相关文章:

  • STM32中的DMA
  • UDP和TCP协议段格式分析
  • 科技在教育领域的创新应用与在工作场所的智能化转型
  • 如何用Chatgpt制作流程图呢?
  • Prompt-to-prompt image editing with cross attention control
  • 云计算实训32——roles基本用法、使用剧本安装nginx、使用roles实现lnmp
  • vue3 组合式API
  • vue3实现 附件上传简单代码示例【自用】
  • 华为账号“一键登录”能力让美团用户尽享安全便捷的登录体验
  • 美国高防服务器测评
  • 【本地网页控制远程开发板】使用Python的Paramiko库通过SSH连接开发板进行通信
  • @Transactional 注解 this调用注解不生效
  • 面向对象设计
  • 数据结构——顺序表
  • 论文翻译:Benchmarking Large Language Models in Retrieval-Augmented Generation
  • 【小程序】微信小程序的生命周期
  • Kubernetes全名及其缩写K8S的正确读音
  • 使用Blender进行3D建模—基础操作笔记
  • 「对比评测」标准WPF DataGrid与DevExpress WPF GridControl有何不同?(一)
  • 基于Springboot宠物商城网站系统--论文pf