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 arkGreen
painter.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));//画y
painter.drawText(QPoint(x*0.5+m_nWidth,y+m_nHeight+11),QString::number(m_nPixMax));//画x
painter.end(); //画完了
painter.begin(this); //在Widget上开始绘制
painter.drawPixmap(0, 0, pixmap); //在控件上绘制pixmap图像
}
void Histogram::InitHistogram(QVector<float> vec, float nMin, float fMax)
{
//vector<int> hist(210);//(srcMatMaxv+1) QVector<int> vPixs;
m_nPixMin = 0,m_nPixMax = vec.size();//默认有较多0像素
//第二步,将统计灰度值换算为坐标x,y
double 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开始有效故加1
m_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_nWidth
m_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开始有效故加1
m_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)
}