2017-10-30 3 views
0

마우스 클릭 기능을 포함하도록 하위 분류했습니다. 여기에서, 사각형은 mousePressEvent, mouseMoveEventmouseReleaseEvent에 의해 선택 될 수있다. 다른 직사각형을 선택하려고 할 때 이전 직사각형이 제거되지 않습니다. 그것은 내가 표시하고 싶지 않은 이전에 그려진 사각형으로 계속 표시됩니다. 하나의 사각형을 선택하여 표시하고 싶습니다. 나는 다른 rectange를 선택하기 위해 다시 누를 때, 이전 rectange가 제거되어야한다는 것을 의미했다.QImage/QLabel에서 잘린 rect를 제거하는 방법?

나는 여기에 포함 된 나의 서브 클래스는 어느 하나의 방법이 문제를 해결하는 방법을 말해 줄래

#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); 
    } 
} 

다음과 같이

#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는 다음과 같이

mouse_crop .H는 mouse_crop 이름? 미리 감사드립니다.

답변

0

새로운 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); 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 하지만 다시자를려고 할 때만 제거됩니다. 하지만이 'QLabel'을 다시 누르면 마치 이전의 하나의 직사각형이 지워지는 것처럼하는 방법. – Sanakum

+0

@Sanakum 귀하의 질문에서 이해 한 바로는 당신이 다른 직사각형을 만들 때 이전 직사각형을 표시하지 말아야한다는 것입니다. 내가 맞습니까? – eyllanesc

+0

네, 당신은 절대적으로 옳습니다. 당신의 솔루션이 제 문제를 해결합니다. 그리고 많은 도움을 주셔서 감사합니다. 그러나 아직도 내가 코멘트에 쓴 몇 가지 문제가있다. 또 다른 것은, 제가 다시 누르면, 이미 얻은 사각형 모서리 점이 변경된다는 것입니다. 그리고 그것은 새로운 포인트 좌표를 보여줍니다. – Sanakum

관련 문제