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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QPixmap或QImage来获取QPainter绘制出来的图形。具体的操作步骤如下: 1. 在程序中创建一个QPixmap或QImage对象,并指定其大小和格式。 2. 创建一个QPainter对象,并将其指定为QPixmap或QImage对象的绘制设备。 3. 在QPainter对象中使用各种绘制函数进行绘制。 4. 绘制完成后,可以将QPixmap或QImage对象保存为图片文件,或者将其作为数据传递给其他模块。 下面是一个简单的示例代码,演示如何获取QPainter绘制的图形: ```cpp // 创建一个QPixmap对象,并指定大小和格式 QPixmap pixmap(300, 300); pixmap.fill(Qt::white); // 创建一个QPainter对象,并将其指定为pixmap的绘制设备 QPainter painter(&pixmap); // 在painter中使用各种绘制函数进行绘制 painter.setPen(Qt::red); painter.drawRect(50, 50, 200, 200); painter.drawText(QRect(50, 50, 200, 200), Qt::AlignCenter, "Hello, world!"); // 保存QPixmap对象为图片文件 pixmap.save("image.png"); // 将QPixmap对象作为数据传递给其他模块 QByteArray data; QBuffer buffer(&data); buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG"); ``` 在上面的示例代码中,我们创建了一个300x300的QPixmap对象,并将其填充为白色。然后,我们创建了一个QPainter对象,并将其指定为pixmap的绘制设备,使用setPen和drawRect函数绘制了一个红色的矩形,并使用drawText函数在矩形中央绘制了一段文字。最后,我们将QPixmap对象保存为PNG格式的图片文件,并将其作为数据保存到一个QByteArray对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值