2017-10-30 10 views
0

マウスクリック機能を含むようにサブクラス化しました。ここで、長方形は、mousePressEvent,mouseMoveEventおよびmouseReleaseEventによって選択することができる。別の矩形を選択しようとしているとき、私の前の矩形は削除されていません。それは私が表示したくない私の以前の描かれた矩形でまだ表示されています。私は1つの長方形だけを選択して表示したい。私は別の矩形を選択するためにもう一度押すと、以前のものを削除する必要がありました。QImage/QLabelから切り取った矩形を削除するには?

私はここに含まれ、私のサブクラスは、いずれかがどのようにこの問題を解決する方法を教えてもらえます

#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'をもう一度押すだけで、前の1つの長方形がクリアされるようにする方法。 – Sanakum

+0

@サナクムあなたの質問で理解したことから、別の矩形を作成するときに前の矩形を表示しないようにしたかったのです。私は正しいですよ? – eyllanesc

+0

はい、あなたは絶対に正しいです、あなたのソリューションは私の問題を解決します。そして、あなたに助けてくれてありがとう。しかし、まだ私がコメントに書いた問題がいくつかあります。もう1つは、もう一度押すと、私が既に得た長方形のコーナーポイントが変更されています。そして新しいポイント座標を示しています。 – Sanakum

関連する問題