如何从 QImage/QLabel 中移除裁剪后的矩形?

How to remove cropped rect from QImage/QLabel?

我做了子类化以包含鼠标点击功能。这里,可以通过mousePressEventmouseMoveEventmouseReleaseEvent来选择一个矩形。当我试图选择另一个矩形时,我以前的矩形没有被删除。它仍然显示我之前绘制的矩形,我不想显示它。我只想选择并显示一个矩形。我的意思是,当我再次按下以选择另一个矩形时,应该删除之前的矩形。

我在这里包含了名为 mouse_crop

的子类

mouse_crop.h如下

#ifndef MOUSE_CROP_H
#define MOUSE_CROP_H

#include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <QMouseEvent>
#include <QLabel>
#include <QRubberBand>

class mouse_crop : public QLabel
{
    Q_OBJECT

public:

mouse_crop(QWidget *parent=0);
QRubberBand *rubberBand;
QPoint origin, ending;

protected:
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

signals:
    void sendMousePosition(QPoint&);
    void sendMouseEnding(QPoint&);
};

#endif // MOUSE_CROP_H`

mouse_crop.cpp如下

#include "mouse_crop.h"

mouse_crop::mouse_crop(QWidget *parent):QLabel (parent)
{

}

void mouse_crop::mousePressEvent(QMouseEvent *ev)
{
    origin = ev->pos();
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        rubberBand->show();
        emit sendMousePosition(origin);
    }
}

void mouse_crop::mouseMoveEvent(QMouseEvent *ev)
{
    rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
}

void mouse_crop::mouseReleaseEvent(QMouseEvent *ev)
{
    ending = ev->globalPos();
    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        emit sendMouseEnding(ending);
    }
}

谁能告诉我如何解决这个问题?提前致谢。

这个问题是因为每次按下鼠标都会创建一个新的QRubberBand,你必须做的就是只创建一个QRubberBand,隐藏它并在需要时显示它。

mouse_crop::mouse_crop(QWidget *parent)
    : QLabel(parent)
{
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    rubberBand->hide();
}

void mouse_crop::mousePressEvent(QMouseEvent *ev)
{
    origin = ev->pos();
    rubberBand->setGeometry(QRect(origin, origin));

    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        rubberBand->show();
        emit sendMousePosition(origin);
    }
}

void mouse_crop::mouseMoveEvent(QMouseEvent *ev)
{
    rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
}

void mouse_crop::mouseReleaseEvent(QMouseEvent *ev)
{
    ending = ev->globalPos();
    if(ev->button()== Qt::LeftButton || ev->button()== Qt::RightButton)
    {
        emit sendMouseEnding(ending);
    }
}