询问一下画波形的问题,有点头大

qq_21042359 2019-05-09 08:28:20
我从网络获取波形数据,每500ms收一次数据,为500个左右的点数。我要实时的把这500个点数描绘出来,但是波形的走动速度是固定的,比采样要慢,怎么样子一个逻辑比较好的展示出波形啊?
...全文
2732 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ch_jm0723 2019-08-13
  • 打赏
  • 举报
回复
我也做过类似的项目 不过是一次读入几万到几十万的点画波形 然后我发现虽然可以工作但qtcharts性能存在很大问题 当时我用的是5.7版本 不知道是我错用了还是确实就是这样 后来我改用了qcustomplot 解决了 性能和它提供的功能都比较可以 需要修改源码的话也还挺方便 你可以看看
Suifqwu 2019-07-10
  • 打赏
  • 举报
回复
https://blog.csdn.net/qq_41399894/article/details/87805015
留给后人
待续_1006 2019-06-12
  • 打赏
  • 举报
回复
学习,接分,走人!
yjglan 2019-06-12
  • 打赏
  • 举报
回复
我发现现在的cns已经不是以前的cns了
qq_21042359 2019-06-12
  • 打赏
  • 举报
回复
引用 12 楼 donwmufromdying 的回复:
用QChart吧。非常方便
举个例子,我只想要下面这图红色框的区域,并且是填满无位移地占满630*150这个大小,用QChart感觉遇到了很多困难,请问下大神能否指点一下
qq_21042359 2019-06-12
  • 打赏
  • 举报
回复
引用 12 楼 donwmufromdying 的回复:
用QChart吧。非常方便
你好,我现在用QChart,发现一些问题: 1.我是在一个630*150的区域上面画图,但是qchartview只能缩小到200*200,导致了Y轴上比较小的数据显示不出来; 2.好像有隐形的坐标轴强制占了一些画面空间,导致我x就算是0开始,也强行在chartview最左边界再往右偏移20个像素左右才开始画。我不需要Y轴,X轴,我只想要波形绘画区占满我整个指定的大小。我已经把qchartview对象中能setvisible都设为false了。
donwmufromdying 2019-06-12
  • 打赏
  • 举报
回复
qwt那都是老黄历了。为啥不用QChart呢?
donwmufromdying 2019-06-12
  • 打赏
  • 举报
回复
用QChart吧。非常方便
翅膀又硬了 2019-05-29
  • 打赏
  • 举报
回复
引用 8 楼 qq_21042359 的回复:
[quote=引用 3 楼 翅膀又硬了 的回复:]
我上传过画这种波形的demo,不过现在下载分不知道怎么变成30分了你可以留个联系方式我发给你

你好,给个网址就行了,我有账号下载的谢谢啦[/quote]30分你也下呀?https://download.csdn.net/download/yunchao630/8611531这个被CSDN给改成30分的,我把代码粘过来吧
qwt.h
#ifndef QWT_H
#define QWT_H
#include <QtGui/QWidget>
#include <ActiveQt/QAxBindable>
#include <QDateTime>
#include <QVector>

#include <QtGui/QMainWindow>
#include "ui_qwt.h"
class QwtPlot;
class QwtPlotCurve;
class qwt : public QMainWindow
{
Q_OBJECT

public:
qwt(QWidget *parent = 0, Qt::WFlags flags = 0);
~qwt();

QwtPlot* m_plot;

QwtPlotCurve* m_curve;
QDateTime m_baseTime;
QVector<QPointF>m_vp;
int m_timeAreaWidth;
void timerEvent(QTimerEvent *e);

double m_timeData[3600];


public slots:
int test(int a);

private:
Ui::qwtClass ui;
};

#endif // QWT_H

qwt.cpp

#include "qwt.h"
#include "qwt_plot.h"
#include "qwt_scale_draw.h"
#include "qwt_plot_layout.h"
#include "qwt_plot_canvas.h"
#include "qwt_plot_curve.h"
#include "QTextCodec"
#include "qwt_plot_grid.h"
#include "qwt_symbol.h"

#include <QVBoxLayout>
#define TIMER_INTERVAL 2
class TimeScaleDrawR: public QwtScaleDraw
{
public:
TimeScaleDrawR(const QDateTime &base):
baseTime(base)
{
}
virtual QwtText label(double v) const
{
QDateTime upTime = baseTime.addSecs((int)v);
return upTime.toString("hh:mm:ss");
}
private:
QDateTime baseTime;
};

qwt::qwt(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
// QVBoxLayout* vLayout = new QVBoxLayout(this);
//

m_plot = new QwtPlot(QwtText("实时曲线图"),this);
m_plot->setCanvasBackground(QBrush(Qt::white));
//vLayout->addWidget(m_plot);
m_plot->setGeometry(0,0,600,400);
test(1);
}

qwt::~qwt()
{

}
int qwt::test( int a )
{
m_timeAreaWidth = 60;
m_plot->setAxisScale(QwtPlot::yLeft, 0, 100);
m_plot->setAxisTitle(QwtPlot::yLeft, "左边");
m_baseTime = QDateTime::currentDateTime();
m_plot->setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDrawR(m_baseTime));

m_plot->setAxisScale(QwtPlot::xBottom, 0, m_timeAreaWidth);
m_plot->setAxisTitle(QwtPlot::xBottom,"底下");
m_plot->setAxisLabelRotation(QwtPlot::xBottom, -50.0);
m_plot->setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft|Qt::AlignBottom);
m_plot->plotLayout()->setAlignCanvasToScales(true);
m_plot->canvas()->setBorderRadius(10);
//m_plot->setGeometry(QRect(20, 70, 1050, 570));
//m_plot->setCanvasBackground(QBrush(Qt:lightGray));

QwtPlotGrid* grid = new QwtPlotGrid();
grid->enableXMin(true);
grid->enableYMin(true);
grid->setMajPen(QPen(Qt::darkGray,0,Qt::DotLine));
grid->setMinPen(QPen(Qt::lightGray,0,Qt::DotLine));
grid->attach(m_plot);
//resize(2110, 1660);
for ( int i = 0; i < m_timeAreaWidth; i++ )
m_timeData[i] =-i;

/*m_timerId = */startTimer(TIMER_INTERVAL*1000); // 1 second

m_curve = new QwtPlotCurve("测试");
m_curve->setPen(QColor(Qt::blue));
m_curve->setRenderHint(QwtPlotItem::RenderAntialiased);

m_curve->attach(m_plot);

///////////////////////
m_curve->setSymbol(new QwtSymbol(QwtSymbol::Cross, Qt::NoBrush,
QPen(Qt::blue), QSize(5, 5) ) );

m_plot->replot();

return 0;
}

void qwt::timerEvent( QTimerEvent *e )
{
qint64 timeVal = (QDateTime::currentDateTime().toMSecsSinceEpoch()-m_baseTime.toMSecsSinceEpoch())/1000;

QPointF pt;
if(m_vp.size() >= m_timeAreaWidth)
{
m_vp.pop_front();
}

pt.setX(timeVal);

pt.setY(rand()%100);

m_vp.append(pt);
qint64 k = timeVal;
for ( int j = 0; j < m_timeAreaWidth; j++ )
{
m_timeData[j] = k--;
}

m_plot->setAxisScale(QwtPlot::xBottom, m_timeData[m_timeAreaWidth - 1 ], m_timeData[0]);

m_curve->setSamples(m_vp);

m_plot->replot();
}
qq_21042359 2019-05-29
  • 打赏
  • 举报
回复
目前需求是网络平均500ms获得500个点,可能这次300多,下次600多,但1秒保证1000点左右。但是波形速度是1秒25个点,要求实时表现出来。也就是说必然会抽点,而且为了内存不爆,开了一个环形缓冲区,读点的速度和写入的速度要平衡,否则读得快了,就会有空白时间的时候,读得慢了,环形区就爆了
qq_21042359 2019-05-29
  • 打赏
  • 举报
回复
引用 3 楼 翅膀又硬了 的回复:
我上传过画这种波形的demo,不过现在下载分不知道怎么变成30分了你可以留个联系方式我发给你
你好,给个网址就行了,我有账号下载的谢谢啦
不易易 2019-05-13
  • 打赏
  • 举报
回复
引用 5 楼 不易易 的回复:
采样之后,你想用什么样的速度显示波形都能自己控制吧,比如用计时器?
或者sleep()
不易易 2019-05-13
  • 打赏
  • 举报
回复
采样之后,你想用什么样的速度显示波形都能自己控制吧,比如用计时器?
Gimlet_Mew 2019-05-13
  • 打赏
  • 举报
回复
引用 3 楼 翅膀又硬了 的回复:
我上传过画这种波形的demo,不过现在下载分不知道怎么变成30分了你可以留个联系方式我发给你


请问可以发给我学习一下吗邮箱:Gimlet_Hzx@yeah.net
  • 打赏
  • 举报
回复
用Qt charts即可,或者qwt 。一次画完即可,一个个画好麻烦哦!
走好每一步 2019-05-10
  • 打赏
  • 举报
回复
QT有很多画曲线的控件的。 10ms画一个点有点夸张了吧,那曲线运行不是要飞起来了
翅膀又硬了 2019-05-10
  • 打赏
  • 举报
回复
我上传过画这种波形的demo,不过现在下载分不知道怎么变成30分了你可以留个联系方式我发给你
qq_21042359 2019-05-09
  • 打赏
  • 举报
回复
比如说我就只在一个600像素长度的地方画,速度是10ms画一个点

16,203

社区成员

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

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