用qt自带的charts画曲线图
1、首先在xxx.pro文件中添加 QT += charts
2、添加一个qt文件
3、添加用到的库文件
#include <QtCharts/QChartView>
4、添加一条宏命令(不添加无法使用)
QT_CHARTS_USE_NAMESPACE
5、修改xxx.h文件
6、xxx.h文件中创建指针
QtCharts::QChart * chart;//图表
QtCharts::QSplineSeries * data1Series;//存放数据
QtCharts::QValueAxis *X;//x轴
QtCharts::QCategoryAxis *Y;//y轴
7、初始化用到的指针(xxx.c文件)
chart=new QtCharts::QChart();
data1Series=new QtCharts::QSplineSeries();
8、定义要画的线的颜色及宽度(可选),不定义会使用默认颜色
QPen pen(QColor(0xff5566)); //设置颜色
pen.setWidth(2); //设置宽度
data1Series->setPen(pen);//加载进去
9、定义曲线的名称
data1Series->setName("测试曲线");
10、定义曲线图的标题
chart->setTitle("曲线图");
11、定义x轴及y轴
//自定义x轴以及相关属性
X=new QtCharts::QValueAxis(chart);
X->setMinorTickCount(7);
X->setTickCount(7);
X->setRange(0,6);
X->setTitleText("x轴");
X->setGridLineVisible(true);//是否显示网格线
X->setMinorGridLineVisible(false);
//自定义y轴以及相关属性
Y=new QtCharts::QCategoryAxis(chart);
Y->setStartValue(0);
Y->setMinorTickCount(6);
Y->setLabelFormat("%u");
Y->setMin(-10);
Y->setMax(30);
Y->setTitleText("y轴");
//刻度线(可选)
Y->append("0",0);
Y->append("10",10);
Y->append("20",20);
Y->append("30",30);
Y->append("40",40);
Y->append("50",50);
Y->setLabelsPosition(QtCharts::QCategoryAxis::AxisLabelsPositionOnValue);
12、将数据加载到chart中(顺序不能调换)
chart->addSeries(data1Series1);
chart->setAxisX(X,data1Series);
chart->setAxisY(Y,data1Series);
13、设置显示风格
chart->setTheme(QtCharts::QChart::ChartThemeLight);
14、将图表显示出来
this->setChart(chart);
this->setRenderHint(QPainter::RenderHint::Antialiasing);
15、静态添加数据
data1Series->append(0,0);
data1Series->append(1,10);
data1Series->append(2,20);
16、如果想动态添加数据 ,可以写一个函数,将数据传进来,然后用静态的方法加载出来就可以,将数据添加到data1Series中,会自动绘制。
17、如果超出图表部分想要自动左移,添加如下
if(data1Series->count() >= 5)
{
X->setRange(data1Series->count()-5,data1Series->count());
}
data1Series->append(nAI,time);
18、如果想让曲线图可以左右拖动,需要重写鼠标事件
//xxx.h中定义
QPoint m_oPrePos;
//xxx.cpp中
m_oPrePos.setX(0);
m_oPrePos.setY(0);
//重写鼠标移动事件
void Form::mouseMoveEvent(QMouseEvent *e)
{
if(ok)
{
QPoint oDeltaPos = e->pos() - m_oPrePos;
chart->scroll(-oDeltaPos.x(),oDeltaPos.y());
m_oPrePos = e->pos();
qDebug()<<e->pos().x();
}
}
//重写鼠标按下事件
void Form::mousePressEvent(QMouseEvent *pEvent)
{
ok = true;
m_oPrePos = pEvent->pos();
qDebug()<<"你按下了鼠标";
this->setCursor(Qt::OpenHandCursor);
}
//重写鼠标松开事件
void Form::mouseReleaseEvent(QMouseEvent *pEvent)
{
ok = false;
this->setCursor(Qt::ArrowCursor);
qDebug()<<"你松开了鼠标";
}
19、如果想要滚轮放大、缩小,需重写滚轮事件(存在误差,非必要就不要使用了)
void Form::wheelEvent(QWheelEvent *pEvent)
{
qreal rVal = std::pow(0.999, pEvent->delta()); // 设置比例
QRectF oPlotAreaRect = this->chart->plotArea();
QPointF oCenterPoint = oPlotAreaRect.center();
oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);
oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal);
QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);
oPlotAreaRect.moveCenter(oNewCenterPoint);
chart->zoomIn(oPlotAreaRect);
}