Qt使用Qwt插件画曲线

你的OPPA 2015-06-10 04:27:24
curve->setRenderHint(QwtPlotItem::RenderAntialiased,true);
curve->setCurveAttribute(QwtPlotCurve::Fitted,true);
这两句代码是使曲线平滑弯曲吗?
我执行后的一开始的结果是对的:

但是到后面的曲线变成了折现,而且不经过数据点:

求大神指点下,这到底是这么回事?
...全文
819 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yuejiang_Li 2018-01-01
  • 打赏
  • 举报
回复
引用 22 楼 hanshengfei的回复:
[quote=引用 21 楼 Yuejiang_Li 的回复:] 我也遇到了这个问题,但后来发现貌似和qwt选取的插值方式有关系,它默认的插值使用sa函数,所以就会导致有些点和取样数据点上的值不一样。(或者换句话说,显示的数组里面值就是你的图里面的值不会变,但是真正的显示到屏幕上的值是一些函数的叠加。。这些函数在其他点处也会有值,有影响,所以曲线就不会再过那个数据点了)。 当点数变多,插值用的sa函数就会变得抖动剧烈,那个插值影响就大了。所以这是你后来发现20个以上数据点就会有这个问题。
我也遇到了这个问题 你是怎么解决的呢[/quote] 这个插值方式最后在qwt的说明里面也没有找到,不过数据如果变化那么的剧烈的话,这种插值方式也能接受
hanshengfei 2017-12-20
  • 打赏
  • 举报
回复
引用 21 楼 Yuejiang_Li 的回复:
我也遇到了这个问题,但后来发现貌似和qwt选取的插值方式有关系,它默认的插值使用sa函数,所以就会导致有些点和取样数据点上的值不一样。(或者换句话说,显示的数组里面值就是你的图里面的值不会变,但是真正的显示到屏幕上的值是一些函数的叠加。。这些函数在其他点处也会有值,有影响,所以曲线就不会再过那个数据点了)。 当点数变多,插值用的sa函数就会变得抖动剧烈,那个插值影响就大了。所以这是你后来发现20个以上数据点就会有这个问题。
我也遇到了这个问题 你是怎么解决的呢
Yuejiang_Li 2017-12-14
  • 打赏
  • 举报
回复
我也遇到了这个问题,但后来发现貌似和qwt选取的插值方式有关系,它默认的插值使用sa函数,所以就会导致有些点和取样数据点上的值不一样。(或者换句话说,显示的数组里面值就是你的图里面的值不会变,但是真正的显示到屏幕上的值是一些函数的叠加。。这些函数在其他点处也会有值,有影响,所以曲线就不会再过那个数据点了)。 当点数变多,插值用的sa函数就会变得抖动剧烈,那个插值影响就大了。所以这是你后来发现20个以上数据点就会有这个问题。
你的OPPA 2015-06-16
  • 打赏
  • 举报
回复
我设置了20个数据点,超过20个数据点就会有点问题。问题解决了,谢谢大家的帮助!
翅膀又硬了 2015-06-12
  • 打赏
  • 举报
回复
另外你也可以试试这个类能不能实现你的功能http://www.qcustomplot.com/
翅膀又硬了 2015-06-12
  • 打赏
  • 举报
回复
引用 14 楼 u011330815 的回复:
[quote=引用 13 楼 翅膀又硬了的回复:]我猜应该就是点太多导致的
你看看setCurveAttribute(QwtPlotCurve::Fitted,true);第一个参数的说明
/*!
Only in combination with QwtPlotCurve::Lines
A QwtCurveFitter tries to
interpolate/smooth the curve, before it is painted.

\note Curve fitting requires temorary memory
for calculating coefficients and additional points.
If painting in QwtPlotCurve::Fitted mode is slow it might be better
to fit the points, before they are passed to QwtPlotCurve.
*/
我刚才试,点多了以后也有问题。

画曲线不可能会点少的啊!这该怎么解决啊[/quote]你不能减少点,点多了之后就别平滑处理了不就行了?或者换一种显示的方式,比如改成填充的
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 11 楼 yunchao630 的回复:
我好像知道原因了。每次重绘前应该修改X范围 ui.qwtPlot->setAxisScale(QwtPlot::xBottom,time[0],time[time.size()-1]);
void test_qwt::timerEvent(QTimerEvent *) { //插入数据 insertData(); curve->setSamples(time,val); if (time.size()>10) { ui.qwtPlot->setAxisScale(QwtPlot::xBottom,time[time.size()-10],time[time.size()-1]); } else { ui.qwtPlot->setAxisScale(QwtPlot::xBottom,time[0],time[time.size()-1]); } ui.qwtPlot->replot(); } 我这样改了还是一样,这问题真的是奇葩了···
翅膀又硬了 2015-06-11
  • 打赏
  • 举报
回复
我好像知道原因了。每次重绘前应该修改X范围 ui.qwtPlot->setAxisScale(QwtPlot::xBottom,time[0],time[time.size()-1]);
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 9 楼 yunchao630 的回复:
setSamples( const double *xData, const double *yData, int size );你的qwt是哪个版本? curve->setSamples(time,val);后面还有一个size的参数吧。另外你的数据要全部都显示吗?如果只需显示最新的一部分,数据多了之后,再插入新数据前,先移去一个最旧的数据 val.pop_front(); time.pop_front();
版本我忘记了,好像是5.2的。 setSamples( const double *xData, const double *yData, int size ) setSamples( const QVector<double> &xData, const QVector<double> &yData ) 我用的是第二种。 我需要曲线中的所有数据点,不能删除的。 另外,这现象是数据多造成的吗?还是因为其他的原因
翅膀又硬了 2015-06-11
  • 打赏
  • 举报
回复
setSamples( const double *xData, const double *yData, int size );你的qwt是哪个版本? curve->setSamples(time,val);后面还有一个size的参数吧。另外你的数据要全部都显示吗?如果只需显示最新的一部分,数据多了之后,再插入新数据前,先移去一个最旧的数据 val.pop_front(); time.pop_front();
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 7 楼 yunchao630 的回复:
或者你把timerEvent里的代码发上来
void test_qwt::timerEvent(QTimerEvent *) { //插入数据 insertData(); curve->setSamples(time,val); ui.qwtPlot->replot(); } //插入数据 void test_qwt::insertData() { if (data_clicked) { m_data = 1; data_clicked = false; } else { m_data = 0; data_clicked = true; } qint64 timeVal = (QDateTime::currentDateTime().toMSecsSinceEpoch() - m_baseTime.toMSecsSinceEpoch())/1000; val.append(m_data); time.append(timeVal); //time.append(m_data); //标志位线 m_plotMaker->setLabel(QString::fromLatin1("y=0")); m_plotMaker->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); m_plotMaker->setLineStyle(QwtPlotMarker::HLine); m_plotMaker->setYValue(0.0); m_plotMaker->attach(ui.qwtPlot); } 大概从2分钟不到就开始了,后面是越来越离谱
翅膀又硬了 2015-06-11
  • 打赏
  • 举报
回复
或者你把timerEvent里的代码发上来
翅膀又硬了 2015-06-11
  • 打赏
  • 举报
回复
整个图上有多少个点?多长时间出现的异常?
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 4 楼 yunchao630 的回复:
[quote=引用 3 楼 u011330815 的回复:] [quote=引用 2 楼 yunchao630 的回复:] 额 正发愁没法平滑呢 呵呵,多谢分享 。估计你这个是 replot 太快或者点太多导致的吧 我刚才试没问题。
太快应该不会的,我设置5秒时间一次都会这样的,点多倒是有可能,但是动态图怎么可能会点少啊,不知道该怎么解决了···[/quote]我这边一秒一次都没问题的。你可以把那块代码单独弄出来,弄个小demo试试。估计是别的问题导致[/quote] 我用demo试过,效果还是一样。一开始是对的,后面越来越离谱了,曲线完全与数据点分离,时间长了,连前面对的地方也变了,这是为什么?
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 15 楼 firebolt2002 的回复:
头一句是打开底层渲染反走样的,和你平滑曲线么啥关系。出现这种情况应该是采样点太粗,也就是说单位时间数据太少。
我每秒2个数据点也是这样的情况,应该不会是单位时间数据少的原因。 倒是很有可能是数据点多了造成的
firebolt2002 2015-06-11
  • 打赏
  • 举报
回复
头一句是打开底层渲染反走样的,和你平滑曲线么啥关系。出现这种情况应该是采样点太粗,也就是说单位时间数据太少。
你的OPPA 2015-06-11
  • 打赏
  • 举报
回复
引用 13 楼 翅膀又硬了的回复:
我猜应该就是点太多导致的 你看看setCurveAttribute(QwtPlotCurve::Fitted,true);第一个参数的说明 /*! Only in combination with QwtPlotCurve::Lines A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \note Curve fitting requires temorary memory for calculating coefficients and additional points. If painting in QwtPlotCurve::Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. */ 我刚才试,点多了以后也有问题。
画曲线不可能会点少的啊!这该怎么解决啊
翅膀又硬了 2015-06-11
  • 打赏
  • 举报
回复
我猜应该就是点太多导致的 你看看setCurveAttribute(QwtPlotCurve::Fitted,true);第一个参数的说明 /*! Only in combination with QwtPlotCurve::Lines A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \note Curve fitting requires temorary memory for calculating coefficients and additional points. If painting in QwtPlotCurve::Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. */ 我刚才试,点多了以后也有问题。
翅膀又硬了 2015-06-10
  • 打赏
  • 举报
回复
引用 3 楼 u011330815 的回复:
[quote=引用 2 楼 yunchao630 的回复:]
额 正发愁没法平滑呢 呵呵,多谢分享 。估计你这个是 replot 太快或者点太多导致的吧 我刚才试没问题。

太快应该不会的,我设置5秒时间一次都会这样的,点多倒是有可能,但是动态图怎么可能会点少啊,不知道该怎么解决了···[/quote]我这边一秒一次都没问题的。你可以把那块代码单独弄出来,弄个小demo试试。估计是别的问题导致
你的OPPA 2015-06-10
  • 打赏
  • 举报
回复
引用 2 楼 yunchao630 的回复:
额 正发愁没法平滑呢 呵呵,多谢分享 。估计你这个是 replot 太快或者点太多导致的吧 我刚才试没问题。
太快应该不会的,我设置5秒时间一次都会这样的,点多倒是有可能,但是动态图怎么可能会点少啊,不知道该怎么解决了···
加载更多回复(2)

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧