logplus/DataMgr/src/DrawWaveView.cpp
2026-01-29 16:57:06 +08:00

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);
}