QPainter绘制折线统计图

1.按路径设置完绘制后,确保end及执行。

void Histogram::paintEvent(QPaintEvent *e)//猜测构造函数中会触发一次
{QPoint pointZero = QPoint(m_pLeftTop.x(),m_pLeftTop.y() + m_nHeight);//坐标原点(直方图左下原点)QPixmap pixmap(size());  //将画布的大小设置为和widget一样的QPainter painter(&pixmap);  //在画布上常见一个画家//设置背景为白(默认为灰)painter.setPen(Qt::NoPen);painter.setBrush(Qt::white);//green  arkGreenpainter.drawRect(rect()); ////1.画黑色边框painter.setBrush(Qt::white);painter.setPen(QPen(Qt::black, 1, Qt::SolidLine));painter.drawRect(m_pLeftTop.x(),m_pLeftTop.y(),m_nWidth,m_nHeight);//,m_nWidth,m_nHeight//2.画折线图painter.setPen(QPen(Qt::darkGray,2,Qt::SolidLine));int nSize=m_vPix.size();if(nSize>1){for(int i = 0;i<nSize-1;i++){QPoint pStart(pointZero.x()+m_dXscale*i,pointZero.y()-m_vPix[i]);QPoint pStop(pointZero.x()+m_dXscale*(i+1),pointZero.y()-m_vPix[i+1]);painter.drawLine(pStart,pStop);//x_vec}}//3.画滑块对应红线painter.setPen(QPen(Qt::red, 1, Qt::SolidLine));int nCur=m_pLeftTop.x()+m_nWidth*ui.hSlider->value()/m_nPixMax;painter.drawLine(QPoint(nCur,m_pLeftTop.y()),QPoint(nCur,m_pLeftTop.y()+m_nHeight));//4.画x,y最大值painter.setBrush(Qt::yellow);int x=m_pLeftTop.x(),y=m_pLeftTop.y();painter.drawText(QPoint(x*0.7,y-5),QString::number(m_fMax));//画ypainter.drawText(QPoint(x*0.5+m_nWidth,y+m_nHeight+11),QString::number(m_nPixMax));//画xpainter.end();  //画完了painter.begin(this);  //在Widget上开始绘制painter.drawPixmap(0, 0, pixmap);  //在控件上绘制pixmap图像
}void Histogram::InitHistogram(QVector<float> vec, float nMin, float fMax)
{//vector hist(210);//(srcMatMaxv+1) QVector vPixs;m_nPixMin = 0,m_nPixMax = vec.size();//默认有较多0像素//第二步,将统计灰度值换算为坐标x,ydouble dYscale = (m_nHeight-3)*1.0/fMax;//过高,暂减3作为补偿if(m_nPixMax<m_nWidth){m_dXscale = m_nWidth*1.0/m_nPixMax;//每个像素在X轴上对应宽度 int/int得到double型0        vector<int> v(m_nPixMax,0);//.resize(m_nWidth+1,0);//0空 从1开始有效故加1m_vPix=v;//m_vPix.resize(m_nWidth+1,0);for(int i=0;i<m_nPixMax;i++){//0像素默认占比较高已过滤//int x_index = i*dXscale;//x轴值m_vPix[i] = vec[i]*dYscale;//获取y轴值 由于小数,可能相邻1/2/3个值存在一起}}else{//m_nPixMax>m_nWidthm_dXscale=1.0;double dXscale = m_nPixMax/m_nWidth*1.0;//每个像素在X轴上对应宽度 int/int得到double型0 vector<int> v(m_nWidth,0);//+1 .resize(m_nWidth+1,0);//0空 从1开始有效故加1m_vPix=v;for(int i=0;i<m_nPixMax;i++){//0像素默认占比较高已过滤int x_index = i*dXscale;//x轴值m_vPix[x_index] = vec[i]*dYscale;//获取y轴值 由于小数,可能相邻1/2/3个值存在一起}}update();//更新直方图 paintEvent(QPaintEvent *e)
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部