(QT-UI)十一、时间轴和其他控件联动显示

  本系列预计实现

①刻度上方文字显示,

②时间轴拖动效果,

③时间轴刻度缩放,

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

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

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

⑦时间轴上绘制时间片

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

1、基础思路

当前后拖动时间轴时,时间轴上的时间可以同步更新到控件QDateTimeEdit上。这里可用信号的方式来传递,在触发update调用paintEvent函数后,当时间轴的计算时间的函数得到结果后,将时间发送到父窗口中,然后父窗口调用QDateTimeEdit一个设置时间函数,完成设置。

2、代码实现

这里的CalInterval函数之前章节已介绍过,是PaintEvent函数里面,自定义的一个计算时间轴绘制内容的函数,

自定一个信号void TimeChangeSignal(QDateTime);参数为QDateTime类型,使用emit函数发送后,再调用控件自带的setDateTime函数,完成设置。

void MyTimeLine::CalInterval(QVector<QLine> &lines, QVector<TextInfo_t>& textInfo)
{
    ...
    //计算得到当前时间后,发送时间改变信号
    emit TimeChangeSignal(m_MoveDateTime);
    ...
}

void MainWindow::InitConnect()
{
    connect(ui->widget, &MyTimeLine::TimeChangeSignal, this, [=](QDateTime dateTime){
        //在MainWindow里面接受信号,并且调用ui->dateTimeEdit设置时间
        ui->dateTimeEdit->setDateTime(dateTime);
    });
}

3、通过信号传递时,应避免互相传递,引起递归发送的问题

需要注意,这里是通过时间轴计算出来一个时间,再发送改变信号给QDateTimeEdit,是一个单向的数据流程,到这里都是没有问题的

但是由于可能有QDateTimeEdit修改后,也需要及时同步到时间轴上显示的需求,就可能存在递归发送的问题了。QDateTimeEdit上修改了时间,发送到时间轴上,时间轴上执行绘制,并且计算出来一个时间,然后又发送给了QDateTimeEdit,QDateTimeEdit接收到新的时间信号,然后又循环下去了。

所以这里可以添加一个判断,当时间轴接收到时间后,和自身显示的当前时间做比较,时间不一致则更新时间轴上的显示,并且发出信号,去更新其他时间控件,其他时间控件接收到时间更新时,也和自身时间比较,不一致才更新。特别是存在多个时间轴和时间控件时,应该尽早制定一个最准确的时间,其余的时间控件参照核心来设置。

    //QDateTimeEdit添加上时间是否不一致判断    
    connect(ui->widget, &MyTimeLine::TimeChangeSignal, this, [=](QDateTime dateTime){
        if(ui->dateTimeEdit->dateTime() != dateTime)
            ui->dateTimeEdit->setDateTime(dateTime);
    });
    
    //MyTimeLine添加上时间是否不一致判断    
    void MyTimeLine::SetDateTime(QDateTime dateTime)
    {
        if(m_bMoving) return;
            if(m_dateTime == dateTime && m_LastIntervalType == m_IntervalType) return;
        ...
        //设置时间
    }

当添加上一个时间判断验证后,就可以减少这种重复调用,但是需要注意的是,时间轴里面的PaintEvent中本身就会经常刷新,所以还是会持续向其他发送信号,但是最终这个只是单方面的阻止了,所以修改时间轴的SetDateTime接口这里还不够,也需要修改发送的位置。

判断当前的缩放比例或上次时间是否发生改变,未改变,则不发送新的信号出去

在这一章节中,把时间轴与其他时间控件捋清楚后,后面的通过定时器更新时间轴,才不会出现时间轴陷入死循环的问题。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值