208 lines
4.6 KiB
C++
208 lines
4.6 KiB
C++
#include "DrawWaveView.h"
|
|
#include <QPainter>
|
|
#include <QLine>
|
|
#include <qfontmetrics.h>
|
|
#include <QPainter>
|
|
|
|
DrawWaveView::DrawWaveView(QWidget *parent) : QWidget(parent),isInit(false)
|
|
{
|
|
m_values=NULL;
|
|
setYGrid(m_yGrid);
|
|
}
|
|
|
|
|
|
void DrawWaveView::paintEvent(QPaintEvent *evt)
|
|
{
|
|
if(m_count > 0)
|
|
{
|
|
QPainter paint;
|
|
paint.begin(this);
|
|
paint.setBrush(Qt::white);
|
|
paint.drawRect(rect());
|
|
paint.save();
|
|
|
|
QPen pen(Qt::red);//lightGray);
|
|
pen.setStyle(Qt::SolidLine);
|
|
pen.setWidth(2);
|
|
paint.setPen(pen);
|
|
//int y1=rect().bottom(),y2=rect().top();
|
|
//paint.drawLine(rect().left()+5,rect().top()+5,rect().right()-5,rect().top()+5);
|
|
|
|
drawCoord(&paint);
|
|
drawHorlines(&paint);
|
|
drawVerLines(&paint);
|
|
// pen.setWidth(2);
|
|
pen.setColor(Qt::darkGray);
|
|
paint.setPen(pen);
|
|
drawDataPoints(&paint);
|
|
paint.restore();
|
|
paint.end();
|
|
}
|
|
|
|
|
|
}
|
|
void DrawWaveView::initView()
|
|
{
|
|
int width=this->width();
|
|
int height=this->height();
|
|
|
|
m_width=width-D_VIEW_MARGIN_LEFT-D_VIEW_MARGIN_RIGHT;
|
|
m_height=height-D_VIEW_MARGIN_BOTTOM-D_VIEW_MARGIN_TOP;
|
|
if(0 >= width || 0 >= height )
|
|
{
|
|
isInit=false;
|
|
|
|
}else
|
|
{
|
|
isInit=true;
|
|
}
|
|
|
|
}
|
|
void DrawWaveView::drawCoord(QPainter *painter)
|
|
{
|
|
|
|
if(!isInit )
|
|
{
|
|
return;
|
|
}
|
|
m_vGridHeight=m_height/(float)m_yGrid;
|
|
m_hGridWidth=m_width/(float)m_xGrid;
|
|
float rangeX= m_Xmax-m_Xmin;
|
|
float rangeY=m_Ymax-m_Ymin;
|
|
m_xGridValue=rangeX/m_xGrid;
|
|
m_yGridValue=rangeY/m_yGrid;
|
|
|
|
// m_pixXValue=m_hGridWidth/m_xGridValue*(rangeX/(m_count-0));
|
|
// m_pixYValue=m_vGridHeight/m_yGridValue;
|
|
|
|
}
|
|
|
|
void DrawWaveView::drawHorlines(QPainter *painter)
|
|
{
|
|
|
|
QVector<QLine> lsLines;
|
|
float offsetY=D_VIEW_MARGIN_TOP;
|
|
|
|
int fontWidth=0;
|
|
int fontHeight=0;
|
|
float offsetYValue=m_Ymin;
|
|
QString horText;
|
|
QFontMetrics metrics(this->font());
|
|
QPoint point;
|
|
painter->setPen(Qt::black);
|
|
for(int i=0;i<=m_yGrid;i++)
|
|
{
|
|
lsLines<<QLine(D_VIEW_MARGIN_LEFT,m_height+offsetY,D_VIEW_MARGIN_LEFT+m_width,m_height+offsetY);
|
|
horText=QString::number(offsetYValue);
|
|
fontWidth=metrics.width(horText);
|
|
fontHeight=metrics.height();
|
|
//绘制垂直坐标文本
|
|
//if( i > 0 )
|
|
{
|
|
point.setX(D_VIEW_MARGIN_LEFT-fontWidth*1.1);
|
|
point.setY(m_height+offsetY+fontHeight/2.);
|
|
painter->drawText(point,horText);
|
|
}
|
|
|
|
offsetY-=m_vGridHeight;
|
|
|
|
offsetYValue+=m_yGridValue;
|
|
|
|
}
|
|
painter->setPen(Qt::lightGray);
|
|
painter->drawLines(lsLines);
|
|
|
|
|
|
}
|
|
|
|
void DrawWaveView::drawVerLines(QPainter *painter)
|
|
{
|
|
QVector<QLine> lsLines;
|
|
float offsetX=0;
|
|
QString verText;
|
|
int fontHeight=0;
|
|
int fontWidth=0;
|
|
float offsetXValue=m_Xmin;
|
|
QFontMetrics metrics(this->font());
|
|
QPoint point;
|
|
painter->setPen(Qt::black);
|
|
for(int i=0;i<=m_xGrid;i++)
|
|
{
|
|
offsetX=i*m_hGridWidth;//m_xGridValue*m_width/(m_count-0);
|
|
offsetXValue=m_Xmin+i*m_xGridValue;
|
|
//if(offsetX>m_width)offsetX=m_width;
|
|
lsLines<<QLine(D_VIEW_MARGIN_LEFT+offsetX,D_VIEW_MARGIN_TOP,D_VIEW_MARGIN_LEFT+offsetX,m_height+D_VIEW_MARGIN_TOP);
|
|
fontHeight=metrics.height();
|
|
verText=QString::number(offsetXValue);
|
|
fontWidth=metrics.width(verText);
|
|
//绘制水平坐标文本
|
|
//if( i>0 )
|
|
{
|
|
|
|
point.setX(D_VIEW_MARGIN_LEFT+offsetX-fontWidth/2.);
|
|
point.setY(D_VIEW_MARGIN_TOP+fontHeight*1.1+m_height);
|
|
painter->drawText(point,verText);
|
|
|
|
}
|
|
//offsetX+=m_hGridWidth;
|
|
//offsetXValue+=m_xGridValue;
|
|
}
|
|
painter->setPen(Qt::lightGray);
|
|
painter->drawLines(lsLines);
|
|
}
|
|
|
|
QPointF DrawWaveView::coordWavePoint(int ix,float value)
|
|
{
|
|
float x=D_VIEW_MARGIN_LEFT+ix*m_width/(m_count-0);//m_pixXValue*ix;
|
|
//x=i*width/(points-1)
|
|
float y=D_VIEW_MARGIN_TOP+m_height*((m_Ymax-value)/(m_Ymax-m_Ymin));//m_pixYValue*(value-m_Ymin);
|
|
return QPoint(x,y);
|
|
|
|
}
|
|
|
|
void DrawWaveView::setValues(float *values)
|
|
{
|
|
if(NULL != m_values)
|
|
{
|
|
m_values=NULL;
|
|
}
|
|
|
|
m_values=values;
|
|
}
|
|
|
|
void DrawWaveView::setCount(int count)
|
|
{
|
|
m_count=count;
|
|
}
|
|
void DrawWaveView::setTime(int time)
|
|
{
|
|
m_time=time;
|
|
}
|
|
void DrawWaveView::setXGrid(int xGrid)//X轴网格数
|
|
{
|
|
m_xGrid=xGrid;
|
|
}
|
|
void DrawWaveView::setYGrid(int yGrid)//Y轴网格数
|
|
{
|
|
m_yGrid=yGrid;
|
|
}
|
|
void DrawWaveView::drawDataPoints(QPainter *painter)
|
|
{
|
|
|
|
float value=0;
|
|
QPolygonF polygon;
|
|
QPointF *points=new QPointF[m_count];
|
|
for(int i=0;i<m_count;i++)
|
|
{
|
|
value= m_values[i];
|
|
points[i]=coordWavePoint(i,value);
|
|
// painter->drawText(points[i],QString::number(value));
|
|
polygon<<points[i];
|
|
}
|
|
painter->setPen(Qt::darkBlue);
|
|
painter->drawPolyline(points,m_count);
|
|
painter->setBrush(Qt::red);
|
|
painter->drawEllipse(points[m_time],5,5);
|
|
//painter->drawText(points[m_time],"*");//QString::number(m_values[m_time]));
|
|
//painter->drawPolygon(polygon);
|
|
} |