QPaint绘制频谱图基础原理(使用QImage)
振幅周期固定,产生相应数据
周期固定,振幅随机,产生相应数据
使用模拟随机数据
核心代码如下:
1 #include "thspectrum.h" 2 3 #include <math.h> 4 5 ThSpectrum::ThSpectrum(QObject *parent) : QThread(parent) 6 { 7 m_thFlag = true; 8 m_img = nullptr; 9 } 10 11 ThSpectrum::~ThSpectrum() 12 { 13 m_thFlag = false; 14 this->wait(); 15 this->quit(); 16 } 17 18 void ThSpectrum::setImg(QImage *in_img) 19 { 20 m_img = in_img; 21 } 22 23 void ThSpectrum::run() 24 { 25 QPainter in_painter; 26 27 m_currentTime.start(); 28 29 while (m_thFlag) 30 { 31 if (nullptr==m_img) 32 { 33 QThread::msleep(1); 34 } 35 36 QImage in_img = *m_img; 37 in_img.fill(Qt::black); 38 39 in_painter.begin(&in_img); 40 41 int in_pointsNum = 200; 42 qreal in_offsetVal = 0; 43 qreal in_stepVal = in_img.width()*1.0 / in_pointsNum; 44 45 QPolygonF in_polygon; 46 in_offsetVal = in_img.height()/2; 47 int in_realRange = 20; 48 in_offsetVal -= in_realRange/2; 49 50 for (qreal in_wVal = 0; in_wVal<in_img.width(); ) 51 { 52 // 随机产生频谱数据 53 //auto in_hVal = qrand()%in_realRange; 54 // 正弦函数 55 auto m_period = 20; //周期 56 auto m_radius = qrand()%in_realRange; // 振幅 57 double in_angle = (double) in_wVal / m_period * 2 * 3.1415926; 58 double in_hVal = m_radius * sin(in_angle); 59 in_hVal += in_offsetVal; 60 in_polygon << QPointF(in_wVal, in_hVal); 61 62 in_wVal += in_stepVal; 63 } 64 65 in_painter.setPen(QColor("#1F94A1")); 66 in_painter.drawPolyline(in_polygon); 67 68 in_painter.end(); 69 70 if (m_currentTime.elapsed()>20) 71 { 72 // 通知界面刷新 73 emit sglUpUiImage(in_img); 74 // 时间间隙重置 75 m_currentTime.restart(); 76 } 77 else 78 { 79 QThread::msleep(1); 80 } 81 } 82 }
附加:模拟产生数据,即一系列的点
1.老方法
qDebug()<<qrand()%10;
2. Qt5.10之后新增该类
//生成一个0和10之间的整数
qDebug()<<QRandomGenerator::global()->bounded(10);
//生成一个0和10.123之间的浮点数
qDebug()<<QRandomGenerator::global()->bounded(10.123);
//生成一个10和15之间的整数
qDebug()<<QRandomGenerator::global()->bounded(10, 15);