陈嘉敏 赵云峰 史家乐
摘 要:在实际开发中如果我们想要快速的开发出一款简单实用的上位机软件,而我们又是侧重底层开发或者刚入门的新手,先前没有进行过相关的操作,这时Qt将是你的一个非常好的选择。Qt采用C++进行编程,完全向下兼容C语言,而且还有丰富的控件,这对于新手是非常容易上手的。而且Qt自带了很多模块,为我们的带来了很多便利。本文我将着重就上位机开发中经常要用到的数据处理结合我前些日子做的一个小例子给大家分享一下如何用Qt实现数据的接收、存储和图形化显示。
关键词:Qt;图表;数据库
引言
本人一直在从事的都是底层的硬件驱动,使用的都是面向过程的语言C语言。但前些日子由于业务需求需要开发一个简单的上位软件监控界面,因此自学了C++和Qt,并最终完成了该监控界面程序的开发,可以实现常用的数据图表化显示,实现简单的曲线图的绘制。下面我将简单总结一下这段时间以来本人的一些经验和遇到的问题,希望能给有这方面需求的人带来一些帮助。
一、准备工作
1)在工程的pro文件中添加QT += charts,这个语句是用来导入图表模块charts,如果没有导入这个模块,图表相关的类都不能使用。
2)在mainwindow.h中添加#include
3)在mainwindow.h中添加如下代码:
QT_CHARTS_BEGIN_NAMESPACE
class QLineSeries;
class QChart;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE
代码分析:从Qt源码定义中可以看出若把上面的代码展开看,就是定义了一个命名空间QT_CHARTS_NAMESPACE,并把需要的两个类添加进这个命名空间中。
二、相关的类及具体实现
想要在Qt中实现曲线图的绘制需要的最基本的类即为Qchart类,除此之外还需要QLineSeries、QChartView、QValueAxis等类。下面我将一一介绍各个类的作用
1)QValueAxis类
这个类的作用是用来自定义坐标轴的。其实Qchart类里也有一个默认的坐标轴,但是一般都不太符合我们的要求,所以一般的做法就是使用这个类定义一个新的(坐标轴)对象,设置相应的参数后设置为Qchar的默认坐标轴。应用代码如下:
QValueAxis *axisX = new QValueAxis;axisX->setRange(0,10);//设置坐标轴范围
axisX->setLabelFormat("%g");//设置坐标轴格axisX->setTitleText("Samples");
QValueAxis *axisY = new QValueAxis;axisY->setRange(0,100);
axisY->setTitleText("Humility");
2)QLineSeries类
这个类还有几个相似的类,例QXYSeries类、QSplineSeries类等,这些类的都是用来平滑曲线,实现把点连接成线的目的。使用时只要把关键坐标点添加进则几个点集中,然后再把这些点集设置成表格图像要显示的点集即可。要注意的是这几个类对关键点的处理方式是不同的,QLineSeries类会把添加进的点以直线方式连接,也即之后会生成折线图,而QSplineSeries类会把关键点以平滑曲线连接,也即最后会生成一个曲线图,在本次项目中我选择的是QLineSeries类来连接关键点,生成曲线图。代码示例如下:
QLineSeries *m_series = new QLineSeries;
QVector
points.append(QPointF(0,20));points.append(QPointF(1,23));
points.append(QPointF(2,12));points.append(QPointF(3,45));
points.append(QPointF(4,23));points.append(QPointF(5,43));
points.append(QPointF(6,3)); points.append(QPointF(7,43));
points.append(QPointF(8,89));points.append(QPointF(9,34));
points.append(QPointF(10,76));
m_series->replace(points);
代码分析:上面的代码先是定义了一个矢量点集points,然后向这个点集中添加了11个点的坐标,然后用replace函数替代m_series中的默认坐标点集。
3)QChart类设置图表格式
QChart类是真正用来生成图形曲线的,用这个类可以对生成的曲线图进行各种格式的设置,代码如下:
QChart *m_chart = new QChart;m_chart->addSeries(m_series);//添加系列
m_chart->setAxisX(axisX,m_series);//设置横坐标轴
m_chart->setAxisY(axisY,m_series);//设置纵坐标轴
m_chart->legend()->hide();//将默认的图例样式隐藏
m_chart->setTitle("Chart test");//设置标题
4)QchartView类显示出图表
QchartView类的作用是为了显示的显示出图表,代码设置如下:
QChartView *chartView = newQChartView(m_chart);chartView->setParent(this);
代码分析:第一句代码的作用是定义一个QChartView类的对象指针,同时为该指针开辟空间,并调用构造函数用先前设置好的图表m_chart去初始化该对象。第二句代码的作用是把该对象指针(控件)添加进主窗口,以能够显示在主窗上。
最后整体的显示效果图如下:
参考文献
[1](美)普拉达(Prata,S.)著;姜佑译.C Primer Plus(第6版)[M].北京:人民邮电出版社,2016:576-589
[2](美)Bruce Eckel.Thinking in C++(第一卷)[M].(美)新泽西:Prentice Hall,1998:319-454
[3]霍亚飞.Qt Creator快速入门[M].北京:北京航空航天大学出版社,2012,5:367-383
[4]霍亚飞.Qt及Qt Quick开发实战精解[M].北京:北京航空航天大学出版社,2012,5:79-100