Rewrite QLabel to realize picture display, frame selection, interception and save

Insert picture description here
I wrote the code for image display, box selection, and saving by rewriting QGraphicsItem before, this time by rewriting QLabel.
The main code to rewrite QLabel is as follows:
mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QObject>
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
#include <QPainter>

class myLabel:public QLabel
{
    
    
    Q_OBJECT
public:
    myLabel(QWidget *parent);
    ~myLabel();
    QPixmap m_loadPixmap;
    QPixmap m_capturePixmap;
    void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
    void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
private:
    bool m_isDown;
    QPoint m_start;
    QPoint m_stop;
    QRect getRect(const QPoint &beginPoint, const QPoint &endPoint);

Q_SIGNALS:
    void getPictureSig(QPixmap catureImage);
};

#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"

myLabel::myLabel(QWidget *parent):QLabel(parent),m_start(QPoint(-1,-1)),m_stop(QPoint(-1,-1))
{
    
    

}

myLabel::~myLabel()
{
    
    

}

void myLabel::mousePressEvent(QMouseEvent *e)
{
    
    
    if(e->button() && Qt::LeftButton){
    
    
        m_isDown = true;
        m_start = e->pos();
        m_stop = e->pos();
    }
}

void myLabel::mouseMoveEvent(QMouseEvent *e)
{
    
    
    if(m_isDown){
    
    
        m_stop = e->pos();
    }
    update();
}

void myLabel::mouseReleaseEvent(QMouseEvent *e)
{
    
    
    if(e->button() && Qt::LeftButton){
    
    
        m_isDown = false;
        QRect selectedRect = getRect(m_start, m_stop);
        m_capturePixmap = m_loadPixmap.copy(selectedRect);
        emit getPictureSig(m_capturePixmap);//将框选的图片传给主界面
    }
}

void myLabel::paintEvent(QPaintEvent * event )
{
    
    
    QLabel::paintEvent(event);
    QPainter painter(this);
    painter.setPen(QPen(Qt::green,2));
    if(!m_isDown){
    
    
        return;
    }
    painter.drawRect(QRect(m_start,m_stop));
}

QRect myLabel::getRect(const QPoint &beginPoint, const QPoint &endPoint)
{
    
    
    int x, y, width, height;
    width = qAbs(beginPoint.x() - endPoint.x());
    height = qAbs(beginPoint.y() - endPoint.y());
    x = beginPoint.x() < endPoint.x() ? beginPoint.x() : endPoint.x();
    y = beginPoint.y() < endPoint.y() ? beginPoint.y() : endPoint.y();

    QRect selectedRect = QRect(x, y, width, height);
    // 避免宽或高为零时拷贝截图有误;
    if (selectedRect.width() == 0)
    {
    
    
        selectedRect.setWidth(1);
    }
    if (selectedRect.height() == 0)
    {
    
    
        selectedRect.setHeight(1);
    }
    return selectedRect;
}

Source connection: https://download.csdn.net/download/weixin_43935474/12511374

Guess you like

Origin blog.csdn.net/weixin_43935474/article/details/106673922