Qt 中 QChart 由于 addSeries 和attachAxis 顺序问题导致无法显示曲线

Qt 中 QChart 由于 addSeries 和attachAxis 顺序问题导致无法显示曲线

这两天写个程序,需要显示一个数据曲线。我原来都是用 QWT, 这次想试试 Qt 中的 QChart。结果这个 QChart 让我折腾了一天多。最开始一直画不出曲线来。后来总算发现是我几个类的使用顺序不对。这里记录一下。

正确的顺序应该是:

  1. 先建立 QChart 对象
  2. 建立 QLineSeries 或者其他的 Series
  3. 建立 QValueAxis 或者其他的 Axis 对象
  4. QChart 对象 用 addSeries 添加 QLineSeries 对象
  5. QLineSeries 用 attachAxis 绑定 Axis 对象
  6. 给 QLineSeries 对象添加数据

按照这个顺序是可以正确显示的。如果 QChart 对象 addSeries 之前,QLineSeries 先用attachAxis 绑定 Axis 对象绑定了一个axis。那么就是显示不出曲线来。
看似没有先后顺序的 第 4 第 5 步。只要搞错了就罢工。不理解QChart 为什么要这么设计。

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Highcharts文帮助文档(带例子) Chart 图标区选项 Chart图表区选项用于设置图表区相关属性。 参数 描述 默认值 backgroundColor 设置图表区背景色 #FFFFFF borderWidth 设置图表边框宽度 0 borderRadius 设置图表边框圆角角度 5 renderTo 图表放置的容器,一般在html放置一个DIV,获取DIV的id属性值 null defaultSeriesType 默认图表类型line, spline, area, areaspline, column, bar, pie , scatter 0 width 图表宽度,默认根据图表容器自适应宽度 null height 图表高度,默认根据图表容器自适应高度 null margin 设置图表与其他元素之间的间距,数组,如[0,0,0,0] [null] plotBackgroundColor 主图表区背景色,即X轴与Y轴围成的区域的背景色 null plotBorderColor 主图表区边框的颜色,即X轴与Y轴围成的区域的边框颜色 null plotBorderWidth 主图表区边框的宽度 0 shadow 是否设置阴影,需要设置背景色backgroundColor。 false reflow 是否自使用图表区域高度和宽度,如果没有设置width和height时,会自适应大小。 true zoomType 拖动鼠标进行缩放,沿x轴或y轴进行缩放,可以设置为:'x','y','xy' '' events 事件回调,支持addSeries方法,click方法,load方法,selection方法等的回调函数。 Color 颜色选项 Color颜色选项用于设置图表的颜色方案。 参数 描述 默认值 color 用于展示图表,折线/柱状/饼状等图的颜色,数组形式。 array Highcharts已经默认提供了多种颜色方案,当要显示的图形多于颜色种类时,多出的图形会自动从第一种颜色方案开始选取。自定义颜色方案的方法:
在使用Qt进行窗口显示的过程,我们可能需要在新窗口展示绘图结果。本文章在前文章实现动态曲线展示的基础上,改进为新窗口实时绘制。具体[Qt]利用QChart实现实时动态的曲线数据展示可参考这里: https://blog.csdn.net/weixin_43487953/article/details/107409852 简单效果如图: 首先添加新的Qt设计师界面类 最终可得到如下界面: 在你需要的ui添加绘图所需控件 利用widget升级为QChartView,显示图像 在主.h private: //新窗口 Display *m; signals: void send_list(QVector<QPointF> line); 在主.cpp m = new Display; connect(this,SIGNAL(send_list(QVector<QPointF>)),m,SLOT(receive_list(QVector<QPointF>))); 在新生成的数据进行发送: emit send_list(newlist); 例如: void MainWindow::updata_plot() { QVector<QPointF> list; QVector<QPointF> newlist; list = line->pointsVector();//获取现在图列表 if (list.size() < line_max) { //保持原来 newlist = list; } else { //错位移动 for(int i =1 ; i< list.size();i++) { newlist.append(QPointF(i-1,list.at(i).y())); } } newlist.append(QPointF(newlist.size(),rand()));//最后补上新的数据 emit send_list(newlist); } 在子.h //QChart #include <QtCharts> using namespace QtCharts; private: //曲线 QSplineSeries* line; //绘图变量和坐标 QChart* chart; //发来数据的接收槽函数 private slots: void receive_list(QVector<QPointF> list); 在子.cpp line = new QSplineSeries(this); chart = new QChart(); chart->addSeries(line); //接收槽函数并进行绘制 void Display::receive_list(QVector<QPointF> list) { line->replace(list);//替换更新 line->setName("pressure");//设置曲线名称 line->setPen(QColor(255, 0, 0));//设置曲线颜色 line->setUseOpenGL(true);//openGl 加速 chart->setTitle("Pressure Data");//设置图标标题 chart->removeSeries(line); chart->addSeries(line); chart->createDefaultAxes();//设置坐标轴 ui->widget->setChart(chart); }
根据项目需求,需要在Qt进行绘图显示我们的数据。这时候,我们就用到了Qt在5.0之后新增的自带QChart控件,不再需要我们自己再去添加第三方库。下面是详细的介绍~ 在.pro文件 QT += charts 在.h文件 //QChart #include <QtCharts> using namespace QtCharts; //定时器 #include <QTimer> private slots: void updata_plot(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); private: //绘图定时器 QTimer *timer_plot; //曲线 QSplineSeries* line; //曲线点的最大数量 int line_max = 100; //绘图变量和坐标 QChart* chart; QValueAxis *axisX; QValueAxis *axisY; 在.cpp文件 //将变量实例化 timer_plot = new QTimer(this); connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot())); line = new QSplineSeries(this); chart = new QChart(); chart->addSeries(line); axisX = new QValueAxis(this); axisY = new QValueAxis(this); //图像更新函数 void MainWindow::updata_plot() { QVector<QPointF> list; QVector<QPointF> newlist; list = line->pointsVector();//获取现在图列表 if (list.size() < line_max) { //保持原来 newlist = list; } else { //错位移动 for(int i =1 ; i< list.size();i++) { newlist.append(QPointF(i-1,list.at(i).y())); } } newlist.append(QPointF(newlist.size(),rand()));//最后补上新的数据 line->replace(newlist);//替换更新 line->setName("pressure");//设置曲线名称 line->setPen(QColor(255, 0, 0));//设置曲线颜色 line->setUseOpenGL(true);//openGl 加速 chart->setTitle("Pressure Data");//设置图标标题 chart->removeSeries(line); chart->addSeries(line); chart->createDefaultAxes();//设置坐标轴 // axisX->setRange(0,line_max);//范围 // axisX->setTitleText("times(secs)");//标题 // axisX->setTickCount(10);//分隔个数 // axisX->setLineVisible(true);//可视化 // axisX->setLinePenColor(Qt::blue);//颜色 // axisY->setRange(-200,1200); // axisY->setTitleText("value"); // axisY->setTickCount(6); // axisY->setLineVisible(true); // axisY->setLinePenColor(Qt::blue); // chart->setAxisX(axisX,line); // chart->setAxisY(axisY,line); ui->widget_plot->setChart(chart); } void MainWindow::on_pushButton_clicked() { timer_plot->start(50);//启动定时器 } void MainWindow::on_pushButton_2_clicked() { timer_plot->stop();//关闭定时器 } 在.ui文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值