一、知识点汇总
Qt中提供了Qt Charts图表模块,可以很方便的绘制折线图、柱形图、饼图等图表。
绘制折线图常用的类有:QChartView、QChart、QLineSeries、QValueAxis等
QChartView:QChart的视图组件,常用的函数有:
void setChart(QChart *chart)设置QChart对象作为显示的图表。
void setRubberBand(const RubberBands &rubberBand)设置鼠标在视图组件上拖动选择范围的方式。
RubberBands 为枚举类型,可取如下值:
QChartView::NoRubberBand ——未指定缩放区域,因此不启用缩放。
QChartView::VerticalRubberBand——只启用指定区域的垂直方向的缩放。
QChartView::HorizontalRubberBand——只启用指定区域的水平方向的缩放。
QChartView::RectangleRubberBand——启用指定区域的垂直和水平方向的缩放
当设置QChartView的该属性时,鼠标右键实现缩小功能。
QChart:图表组件,常用的函数有:
void setTitle(const QString &title) 设置图表标题
void addSeries(QAbstractSeries *series) 添加数据序列
void setAxisX(QAbstractAxis *axis, QAbstractSeries *series = Q_NULLPTR)设置X轴
void setAxisY(QAbstractAxis *axis, QAbstractSeries *series = Q_NULLPTR)设置Y轴
void setTheme(QChart::ChartTheme theme) 设置主题
缩放相关函数
void zoomIn()
void zoomIn(const QRectF &rect)
void zoomOut()
void zoomReset()
QLineSeries:数据序列类
添加数据点函数
void append(qreal x, qreal y)
void append(const QPointF &point)
void append(const QList<QPointF> &points)
清除全部数据点函数
void clear()
QValueAxis:数值坐标轴类
void setRange(qreal min, qreal max) 设置坐标轴范围
二、编程实战
说明:
在VS+Qt中使用Qcharts时,在项目——属性——C/C++——常规的附加包含目录中输入 $(QTDIR)\include\QtCharts, (Release和Debug模式下都需要添加);在项目—属性—链接器—输入的附加目录中输入Qt5Chartsd.lib(Debug)和Qt5Charts.lib(Release)
并在需要使用QtCharts 类的头文件或源程序文件中, 要使用如下的包含语句:
#include <QtCharts>
using namespace QtCharts ;
在需要显示中文的源程序文件上面添加如下语句,解决中文乱码问题:
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
在头文件中添加绘图相关变量和函数的声明,注意添加相应的头文件引用
QChartView *chartView;
QChart *chart;
QLineSeries *series;
QValueAxis *axisX,*axisY;
QTimer m_timer; //定时刷新曲线
public slots:
void generateData( ); //定时器对应的槽函数
在源文件中初始化相关变量和函数
chartView = new QChartView(this); //创建ChartView,包含头文件<qchartview.h>
chart = new QChart();//创建Chart,包含头文件<qchart.h>
chart->setTitle("绘制曲线"); //设置图像标题
//设置chart主题
chart->setTheme(QChart::ChartThemeBlueCerulean);
chart->layout()->setContentsMargins(0,0,0,0);//QChart与View的边距
chartView->setChart(chart); //Chart 添加到ChartView
chartView->setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴),右键缩小
series = new QLineSeries; //序列点
series->setName("序列1"); //图例名称
chart->addSeries(series);
axisX = new QValueAxis; //坐标值
axisY = new QValueAxis; //坐标值
axisX->setRange(0, 100); //X轴坐标范围
axisY->setRange(0, 100); //Y轴坐标范围
chart->setAxisX(axisX, series);//添加坐标轴
chart->setAxisY(axisY, series);
//添加布局
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->setContentsMargins(0, 0, 0, 0);//布局填满窗口
vLayout->addWidget(chartView);
this->setLayout(vLayout);
range = 0;
generateData();
//定时器1s产生一组随机数据
void generateData()
{
series->clear();
range++;
for (int i = 0; i <= 100; i++)
{
double yValue = 50 * sin(i*3.14 / 25 + range);
series->append(i, yValue);
}
}
//鼠标滚轮控制缩放
//添加头文件#include <QWheelEvent>
void wheelEvent(QWheelEvent *event);//重写鼠标滚轮事件
//在源文件中实现鼠标滚轮放大缩小绘图区域
void lineChartDemo::wheelEvent(QWheelEvent *event)
{
if (event->delta() > 0)
chart->zoom(1.1);
else
chart->zoom(0.9);
}
运行效果