问题描述:

在QLabel上显示一张图片,然后在该图片上画一个矩形框  最后保存一张带矩形框的图片

 

第一步:

在图片上画矩形框   网上教程很多  代码如下: 头文件

#ifndef MYQLABEL
#define MYQLABEL

#include <QLabel>
#include <QMouseEvent>
#include <QString>

class MyQLabel : public QLabel{
//    Q_OBJECT
public:
//    explicit MyQLabel();
    void paintEvent(QPaintEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    int x1, y1, x2, y2;

    void savePicture(QString path, int filename);

public:
    int getX1() {return x1;}
    int getY1() {return y1;}
    int getX2() {return x2;}
    int getY2() {return y2;}
};

#endif // MYQLABEL

 

源文件:

#include <QPainter>
#include <QPen>
#include <QRect>
#include <QCursor>
#include <QApplication>
#include <QPixmap>
#include <QImage>

#include "myqlabel.h"

void MyQLabel::paintEvent(QPaintEvent *event)
{
    //comment before
    QLabel::paintEvent(event); //绘制背景的图片

    QPainter painter(this);

    painter.setPen(QPen(Qt::red, 2));
    painter.drawRect(QRect(x1, y1, x2 - x1, y2 - y1));
}

void MyQLabel::mousePressEvent(QMouseEvent *event)
{
    x1 = event->pos().x();
    y1 = event->pos().y();
    QCursor cursor;
    cursor.setShape(Qt::ClosedHandCursor);
    QApplication::setOverrideCursor(cursor);
}

void MyQLabel::mouseReleaseEvent(QMouseEvent *event)
{
    x2 = event->pos().x(); //鼠标相对于所在控件的位置
    y2 = event->pos().y();
    update();
    QApplication::restoreOverrideCursor();

}

void MyQLabel::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        x2 = event->pos().x(); //鼠标相对于所在控件的位置
        y2 = event->pos().y();
        update();
    }
}

 

 

第二步:

保存画完后的整个图形

思路如下:

取得QLabel上的图像  将其加入到一个Painter   然后获取之前画的矩形框的  起始 和终止坐标  重新绘制 然后保存

QImage tmpimage = image.copy();

    QPixmap pmap;
    pmap = pmap.fromImage(tmpimage);
    label_video1->setPixmap(pmap);

    QImage img(label_video1->pixmap()->toImage());
    QPainter painter;
    painter.begin(&img);
    painter.setPen(QPen(Qt::red, 2));
    painter.drawRect(QRect(label_video1->getX1(), label_video1->getY1(),
                           label_video1->getX2() - label_video1->getX1(),
                           label_video1->getY2() - label_video1->getY1()));
    painter.end();
    label_video2->setPixmap(QPixmap::fromImage(img));