底层图片用drawPixmap()
上层QLabel自带控件属性,直接ui设计器中修改的

在这里插入图片描述

QPixmap是绘图设备,采用双缓冲机制绘图。—摘自《Qt开发及实例》P384页,对应的pdf中页码P397
QImage是 对于图像像素处理

尽量使用setPixmap绘图,
使用drawPixmap时,本意想在图片上显示矩形框,但发现不成功,被遮盖了。

使用drawPixmap的例子:

代码如下:

void NewTestForm::paintEvent(QPaintEvent *event)
{
    //QPainter dc(&m_image);
    QPainter dc(this);
  //  if(m_bisPress)
    {


        QPen pen(Qt::red);
        dc.setPen(pen);
        int nWidth  =  abs(m_nNewPt.x() - m_nOldPt.x());
        int nHeight = abs(m_nNewPt.y() - m_nOldPt.y());
        //dc.drawRect(ui->label_2->pos().x() + m_nOldPt.x(), ui->label_2->pos().y() + m_nOldPt.y(), nWidth, nHeight);


        dc.drawRect( 30,  350, 100, 100);


    }


    for(int i = m_image.width() / 2 - 3; i <= m_image.width() / 2; i++)
    {
        m_image.setPixel(i, m_image.height() / 2, 0);
    }


    QPixmap pix = QPixmap::fromImage(m_image);
    //ui->label_2->setPixmap(pix);
    dc.drawPixmap(ui->label_2->geometry().x(),ui->label_2->geometry().y(),ui->label_2->width(), ui->label_2->height(), pix);


    //dc.drawLine(10,10,100,100);//点(10,10)和(100,100)是在图像上这个画图设备的


}

界面显示:红色地方被遮盖了
在这里插入图片描述

使用setPixmap

void NewTestForm::paintEvent(QPaintEvent *event)
{
    QPainter dc(&m_image);
    i = m_image.width() / 2 - 3; i <= m_image.width() / 2; i++)
    {
        m_image.setPixel(i, m_image.height() / 2, 0);
    }


    dc.setPen(Qt::red);
   // dc.drawLine(m_nOldPt.x(), m_nOldPt.y() , m_nOldPt.x() + 15, m_nOldPt.y() + 15);


    dc.drawLine(100, 100 ,25,25);


    QPixmap pix = QPixmap::fromImage(m_image);
    ui->label_2->setPixmap(pix);


    dc.drawLine(100*1.6,100*1.6,100*1.6,200*1.6);//点(10,10)和(100,100)是在图像上这个画图设备的


}

paintEvent

在上面两个函数都是在## paintEvent中实现的,

  • 第一个函数中 QPainter dc(this)

画布为整个窗体,所以,在画布上画点时,基准点为 窗口的左上角。

  • 第二个函数 QPainter dc(&m_image);
    画布为m_image 图像,要注意图像在ui->label_2->setPixmap(pix);之前的m_image是否缩放了。
    本例中,在此处之前的m_image没有被缩放,所以,在画布上画点时,
dc.drawLine(100*1.6,100*1.6,100*1.6,200*1.6);//点(10,10)和(100,100)是在图像上这个画图设备的

图像上的点要放大到画布上,就有了前面的X * 1.6
同理,如果控件中图像被放大了,画点时也要缩小到画布上。
最终是在画布上进行画的,一定要统一到画布上去。

参考文献

QT Q Image QPixmap ·QBitmap 三者区别
https://blog.51cto.com/11496263/1867507

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐