Qt中基于QCustomPlot实现曲线绘制和显示的研究

2019-11-19 12:13徐瑶
科技视界 2019年25期

徐瑶

【摘 要】为了更加直觀有效的绘制和显示雷达产生的大量数据,本文提出了一种Qt平台下基于QCustomPlot实现曲线绘制和显示的方法,该方法可以简单方便的定制曲线窗和曲线的外观,有效简化了曲线绘制的流程,降低了开发过程中功能实现的难度。通过在某型雷达显控软件中使用该方法绘制和显示雷达校正样本数据,验证了该方法的有效性。

【关键词】QCustomPlot;Qt平台;校正样本数据

中图分类号: TP368.1文献标识码: A文章编号: 2095-2457(2019)25-0054-002

DOI:10.19694/j.cnki.issn2095-2457.2019.25.025

0 引言

随着雷达技术的不断发展,最终送至雷达显控软件界面上显示的信息也越来越多,以校正样本数据为例,视校正通道的数量不同,可能需要同时显示几十至上百个通道的数据,每个通道又包含几十至上百个采样点。如此巨大数量的数据如果采用常规的列表显示,不但列表数据庞大,而且使用起来效率低下,对操作人员非常不友好。因此,我们需要使用二维图表来直观形象的显示这些数据[1]。

雷达显控软件为了绘制曲线信息,采用了多种第三方库和插件,较为常用的有TeeChart[2]、qwt[3-4]等,其中TeeChart绘制图形表现形式丰富,但因其是商业软件,会给部分开发者带来较大的经济负担;qwt具有跨平台的属性,代码开源,但表现形式略显不足,不能满足细节需要精细显示的项目需要。

为实现复杂曲线绘制和显示,本文提出一种在Qt中基于QCustomPlot来实现的方法。使用该方法可以同时显示多个曲线窗,改善了之前使用传统方法处理只能显示一个曲线窗的状况。并在每个曲线窗中绘制多条二维曲线,方便进行多条曲线之间的比较。操作人员还可以随意获取每条曲线的信息,有利于快速定位问题。该方法容易上手、使用简便,并且可以跨平台使用,不但可以解决前文中提到的问题,还可以给软件操作人员提供更好的数据显示效果。

1 相关技术

QCustomPlot是在Qt框架下实现的基于LGPL版权协议的开源项目,它无需进一步的库依赖,文档丰富且使用方便,主要完成二维曲线的绘图和数据可视化,如曲线图、趋势图、坐标图、柱状图等。

(1)将帮助文档qcustomplot.qch复制到Qt目录下,打开Qt,工具->选项->帮助->添加,选择qcustomplot.qch,安装帮助文档。

(2)将qcustomplot.h文件和qcustomplot.cpp文件复制到工程文件里,并在项目里添加这两个文件。

(3)在.pro文件中加入语句 QT+=printsupport。

此时就可以将项目中的QWidget控件提升为QCustomPlot控件使用了。

2 复杂曲线绘制及显示的实现

2.1 曲线窗模块数据处理流程

仍以雷达显控软件中显示校正样本数据的曲线窗为例,基于QCustomPlot的曲线窗显示和绘制模块主要包括四个部分,即数据接收模块、数据管理模块、人机交互模块和显示绘制模块.数据接收模块接收经由网络发来的校正样本数据,数据管理模块负责对校正样本数据的解析、保存及管理,人机交互模块负责实现曲线窗的人机交互功能,显示绘制模块负责使用QCustomPlot控件来绘制校正样本数据,并将其显示出来。

2.2 曲线窗主窗体设计

曲线窗主窗体包含多个子窗体,均为由QWidget控件提升而成QCustomPlot控件,分别用来显示校正前和校正后的样本数据,每个子窗体中同时显示所有通道的样本数据,每个通道显示为一条二维曲线。

2.3 子窗体数据管理设计

在每个子窗体中需要绘制多条二维曲线,每条对应一个通道的样本数据。对于由数据接收模块接收到的校正样本数据,程序首先识别不同的校正样本数据类型,根据校正样本数据类型判断出通道数和每个通道的样本数。由于数据包中的校正样本数据是一维线性排列的,需要根据通道数和样本数解析出每条二维曲线的数据,送给显示绘制模块的同时还作为二维数组保存至本地。

2.4 子窗体的绘制显示设计

2.4.1 设置子窗体和曲线显示的外观

设置子窗体外观的代码如下:

QCustomPlot * m_CurvePlot;

m_CurvePlot->plot->xAxis->setBasePen(QPen(QColo(239,239,239)));//设置横轴的颜色

m_CurvePlot->plot->xAxis->setTickPen(QPen(QColor(239,239,239)));//设置横轴主刻度的颜色

m_CurvePlot->plot->xAxis->setTickLabelFont(QFont("宋体",9));//设置横轴刻度标记的字体

m_CurvePlot->plot->xAxis->setTickLabelColor(QColor(239,239,239));//设置横轴刻度标记的颜色

m_CurvePlot->plot->yAxis->setBasePen(QPen(QColor(239,239,239)));//设置纵轴的颜色

m_CurvePlot->plot->yAxis->setTickPen(QPen(QColor(239,239,239)));//设置纵轴主刻度的颜色

m_CurvePlot->plot->yAxis->setTickLabelFont(QFont("宋體",9));//设置纵轴刻度标记的字体

m_CurvePlot->plot->yAxis->setTickLabelColor(QColor(239,239,239));//设置纵轴刻度标记的颜色

m_CurvePlot->plot->setBackground(QBrush(Qt::NoBrush));//设置窗体背景的画刷

设置子窗体中曲线的显示样式的代码如下:

m_CurvePlot->plot->legend->setVisible(false);//设置图例说明是否可见

m_CurvePlot->plot->graphs[i]->setLineStyle(QCPGraph::IsLine);//设置线条的样式

m_CurvePlot->plot->graphs[i]->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle,6));//设置点的样式

2.4.2 数据更新

首先调用函数setData(const QVector&key, const QVector&value)更新曲线数据,再调用函数replot()重绘当前子窗体中显示的曲线。

2.4.3 数据删除

调用函数removeGraph(graphs[i])删除给定序号的曲线,再调用函数replot()重绘删除某些曲线后子窗体的显示。

2.5 子窗体的人机交互设计

由于校正样本数据通道数较多,所以本例中设置不显示图例,并使用setColor函数给每条曲线设置不同的颜色。但受到显示器显示效果和人眼对不同颜色识别能力的制约,当二维曲线数量达到几十条甚至上百条的时候,操作人员很难通过颜色或图例来区分不同通道的曲线,故程序中加入选中某条曲线的功能,利用Qt中的信号与槽机制,当操作人员使用鼠标选中某条曲线的时候会自动释放selectionChangedByUser()信号,将其与槽函数关联,在槽函数中判断graphs[i]->selected()为真时的i值,并将其更新到界面上,提示当前选中的曲线序号。

3 应用实例

在某型雷达项目显控软件开发中采用Qt5.7.0进行校正样本数据绘制和显示,显示效果如图4所示。通过实际应用,证明该曲线窗可以很好的满足项目的实际需求,并且在开发新项目和在不同的平台上移植时都简便快捷。

【参考文献】

[1]丁鹭飞,耿富录.雷达原理[M].4版.西安:西安电子科技大学出版社,2009:4.

[2]陈俊良,叶林,葛俊锋,等.TeeChart控件在实时检测系统上位机软件中的应用[J].2015,28(6):13-15.

[3]高菲,袁媛,林成地,等.Qwt类库在二维云图绘制中的应用[J].现代电子技术,2014,37(14):100-102.