Как удалить обрезанный прямоугольник из QImage/QLabel?

Я сделал подкласс, чтобы включить функцию щелчка мыши. Здесь прямоугольник можно выбрать с помощью mousePressEvent, mouseMoveEvent и mouseReleaseEvent. Когда я пытаюсь выбрать другой прямоугольник, мой предыдущий прямоугольник не удаляется. Он все еще отображается с моим предыдущим нарисованным прямоугольником, который я не хочу отображать. Я хочу выбрать и отобразить только один прямоугольник. Я имел в виду, что когда я снова нажимаю, чтобы выбрать другой прямоугольник, предыдущий должен быть удален.

Я включил сюда свой подкласс с именем 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);
    }
}

Может ли кто-нибудь сказать мне, как это решить? Заранее спасибо.


person Sanakum    schedule 30.10.2017    source источник


Ответы (1)


Проблема вызвана тем, что каждый раз, когда вы нажимаете кнопку мыши, вы создаете новый 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);
    }
}
person eyllanesc    schedule 30.10.2017
comment
Спасибо за ваш ответ. Но снимает только когда пытаюсь заново кадрировать. Но как сделать, если я просто снова нажму на этот QLabel, предыдущий прямоугольник будет очищен. - person Sanakum; 30.10.2017
comment
@Sanacum Из того, что я понял в вашем вопросе, вы хотели, чтобы предыдущий прямоугольник не отображался при создании другого прямоугольника. Я не ошибаюсь? - person eyllanesc; 30.10.2017
comment
Да, вы абсолютно правы, ваше решение решает мою проблему. И большое спасибо за помощь. Но все же есть некоторые проблемы, о которых я написал в комментарии. И другое дело, когда я просто нажимаю еще раз, меняется угловая точка прямоугольника, которую я уже получил. И он показывает новые координаты точки. - person Sanakum; 30.10.2017
comment
@Sanacum Если мой ответ правильный, почему вы не отметили его как правильный? Можно поточнее и описательнее в своих проблемах, я не понимаю? Я попробовал это, и это работает, как вы говорите, тоже. - person eyllanesc; 30.10.2017
comment
@Sanakum Если у вас есть другие проблемы, вы можете создать новый вопрос. - person eyllanesc; 30.10.2017