QCustomPlot系列(5)-实时动态曲线[通俗易懂]

QCustomPlot系列(5)-实时动态曲线[通俗易懂]先来个动图看看效果:支持鼠标平移、滚轮缩放、框选放大、取消框选、一键全显、单击显示xy坐标值。。等平移功能是QCustomPlot自带的功能,参见我的该系列前面的博文。框选放大、全显等功能在另一篇博文中也讲到了。这里只讲2个知识点:1、显示鼠标指向的点坐标,2、实时滚动1、箭头指向要显示的坐标点,代码步骤:(1)添加新类,继承QCustomPlot添加private成员变…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

先来个动图看看效果:

支持鼠标平移、滚轮缩放、框选放大、取消框选、一键全显、单击显示xy坐标值。。等

QCustomPlot系列(5)-实时动态曲线[通俗易懂]

平移功能是QCustomPlot自带的功能,参见我的该系列前面的博文。框选放大、全显等功能在另一篇博文中也讲到了。

这里只讲2个知识点:1、显示鼠标指向的点坐标,2、实时滚动

1、箭头指向要显示的坐标点,代码步骤:

(1)添加新类,继承QCustomPlot
添加private成员变量:

QCPItemText *textLabel;//单击时提示信息框
QCPItemLine *arrow;//提示信息的箭头
在构造中初始化他俩:
    //下面这一段是从QCustomPlot官网抄来的
    /*显示数值的提示框*/
    textLabel = new QCPItemText(this);
    textLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter);//方框置于上部中间
    textLabel->position->setType(QCPItemPosition::ptAxisRectRatio);
    textLabel->position->setCoords(0.5, 0); // place position at center/top of axis rect
    textLabel->setFont(QFont(font().family(), 16)); // 字体
    textLabel->setPen(QPen(Qt::black)); // 颜色

    //指向数值的箭头:
    arrow = new QCPItemLine(this);
    arrow->start->setParentAnchor(textLabel->bottom);//箭头起点位于提示框的下边框中点
    //arrow->end->setCoords(4, 1.6); // 设置箭头的终点
    arrow->setHead(QCPLineEnding::esSpikeArrow);//箭头类型
    textLabel->setVisible(false);//提示框不可见
    arrow->setVisible(false);//箭头不可见

(2)重写鼠标按下/弹起事件

void MultiCurvesPlot::mousePressEvent(QMouseEvent *event)
{
    //重写后,仍然要使父类的函数,否则自带的拖动功能等就失效了
    QCustomPlot::mousePressEvent(event);//父类的函数

    if(event->buttons() & Qt::LeftButton)//按下鼠标左键
    {
        textLabel->setVisible(true);//提示框可见
        arrow->setVisible(true);//箭头可见
        double x = xAxis->pixelToCoord(event->pos().x());//鼠标坐标转化为XY轴的坐标
        double y = yAxis->pixelToCoord(event->pos().y());
        arrow->end->setCoords(x, y); // 设置箭头的终点
        QString xTime = QDateTime::fromMSecsSinceEpoch(x * 1000.0).toString("hh:mm:ss.zzz");//把单击处的X值转换为时间String
        textLabel->setText(QString("x = %1\ny=%2").arg(xTime).arg(y));//显示XY值
    }
}
void MultiCurvesPlot::mouseReleaseEvent(QMouseEvent *event)
{
    QCustomPlot::mouseReleaseEvent(event);

    if(event->button() == Qt::LeftButton)//左键弹起
    {
        textLabel->setVisible(false);//隐藏数值方框和箭头
        arrow->setVisible(false);
    }

}

2、实时滚动的曲线
我们要做的就两点:1、向graph中添加新的点 this->graph(graphIdx)->addData(currentTime,  y);  2、实时修改X轴的显示范围

在我这个例子中,X轴是实时时间,所以,要想使曲线实时滚动,只要把X轴的显示范围实时修改为:从<当前时间-当前X轴的显示宽度>到<当前时间>即可, 这样曲线就会滚动起来。其中,当前X轴的显示宽度可以从xAxis->range().size()读取。

注意:如果我们接收到的数据点过于频繁,我们不应该每收到一个点都要刷新图像,那样程序效率太低,也没必要。一般设置每30ms刷新一次就足够流畅了,毕竟我们下载的普通电影也就30帧每秒。

因此,我们在一个30ms定时器的槽函数中来做:修改X轴的显示范围+刷新图像。

代码步骤如下:

(1)在构造函数中启动QWidget自带的定时器
 

startTimer(30, Qt::CoarseTimer);//每30ms触发一次timeEvent事件

(2)重写void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;函数来响应这个定时器的超时事件:
 

void MultiCurvesPlot::timerEvent(QTimerEvent *event)
{
    Q_UNUSED(event);

    if(autoScroll)//如果启动了自动滚动功能
    {
        double curSeclf = (double)(QDateTime::currentMSecsSinceEpoch()) / 1000.0;//读取当前时间(因为QCustomPlot支持的时间值的ms值在小数位,所以/1000.0了)
        this->xAxis->setRange(curSeclf - xAxis->range().size(), curSeclf);//实时调整X轴的显示范围
    }
    this->replot();//刷新图像
}

代码就这些,非常简单。

群号在左边。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181333.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月16日 下午3:36
下一篇 2022年10月16日 下午3:46


相关推荐

  • Word域的应用和详解

    Word域的应用和详解本文主要内容:域基础通用域开关表格操作符和函数编号域  ■第一章域基础一、域的作用  微软的文字处理软件MicrosoftWord系列,其方便和自动化程度是其他任何文字处理软件所望尘莫及的。究其原因,其一,微软有强大的软件开发技术人员队

    2022年6月12日
    46
  • mysql安装包5.7.17.0_mysql-5.7.17-winx64压缩版的安装包下载和安装配置「建议收藏」

    mysql安装包5.7.17.0_mysql-5.7.17-winx64压缩版的安装包下载和安装配置「建议收藏」网上有很多的安装配置步骤,但是一个跟一个遇到的问题不一样,总之越是写的完整的人,遇到的错误越多,在安装过程中也就越悲催!第一步:下载mysql安装包—下载网址https://downloads.mysql.com/archives/community/第二步:找到你下载的文件夹,解压。然后你在任意一个磁盘内新建一个文件夹把它放好,这个文件夹就作为它的安装目录,我建的是这个路径—->F…

    2022年4月19日
    47
  • linux查看磁盘io使用情况

    linux查看磁盘io使用情况top 命令 vmstat 命令 iostat 命令 iotop 命令 pt ioprofile 命令 top 11 41 22up51min 2users loadaverage 0 01 0 04 0 01Tasks 130total 1running 129sleeping 0stopped 0zombieCpu s 0 2 us 0 1 sy 0 0 ni 99 2 id 0 4 wa 0 0 hi 0 0 si 0 0 stMem 4151

    2026年3月20日
    2
  • 走进webpack(1)–环境拆分及模块化

    初级的文章和demo已经基本完成了,代码也已经上传到了我的github上,如果你对webpack的使用并不是十分了解,那么建议你回头看下走近系列,里面包括了当前项目中使用频繁的插件,loader的讲解

    2022年3月25日
    44
  • 对象转JSON首字母大写[通俗易懂]

    对象转JSON首字母大写[通俗易懂]最近在做一个第三方接口,接口给的数据类型如下请求报文如下{“A0144″:”12141256″,”AB6AM”:”中国银行支行”,”STATUS”:1}一般按照对象转JSON会使首字母小写,与接口文档不相符,因此需要转为大写,在字段名称前加@JSONField(name=””)注释即可如下:packagecn.com.cis.acic.util.personHr.vo.request;importcom.alibaba.fastjson.annotation.JS…

    2025年12月10日
    7
  • Python – 0b、0o、0x

    Python – 0b、0o、0xa=0b010b=0o010c=0x010print(type(a),a)print(type(b),b)print(type(c),c)#————-print(0b010&0b111)print(0b001|0b010)print(0b010^0b100)print(~0b001)#原码->补码->求原码(原码的值+符…

    2022年6月24日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号