qtrubber-bandqmouseevent

Movable QRubberband from one point to another


I have drawn a QRubberband on QLabel. i can resize it using QSizeGrip. Now I want to move it from one point to another using QMouseevents. Is there any one who can help me out.

void CropImage::mousePressEvent(QMouseEvent *event)
{
    QLabel::mousePressEvent(event);
    lastPoint = event->pos();
    rubberband = new QRubberBand(QRubberBand::Rectangle,this);
    rubberband->setGeometry(QRect(lastPoint, QSize()));
    rubberband->show();

}

void CropImage::mouseReleaseEvent(QMouseEvent *event)
{
    newPoint = event->pos();
}

this is my subclass part which is used for mouse events. the code is as following:

Resizable_rubber_band::Resizable_rubber_band(QWidget *parent) : QWidget(parent)
{
 //tell QSizeGrip to resize this widget instead of top-level window
 setWindowFlags(Qt::SubWindow);
 QHBoxLayout* layout = new QHBoxLayout(this);
 layout->setContentsMargins(0, 0, 0, 0);
 QSizeGrip* grip1 = new QSizeGrip(this);
 QSizeGrip* grip2 = new QSizeGrip(this);
 layout->addWidget(grip1, 0, Qt::AlignLeft | Qt::AlignTop);
 layout->addWidget(grip2, 0, Qt::AlignRight | Qt::AlignBottom);
 rubberband = new QRubberBand(QRubberBand::Rectangle, this);
 rubberband->move(0, 0);
 rubberband->show();
}

 void Resizable_rubber_band::resizeEvent(QResizeEvent *)
 {
    rubberband->resize(size());
 }

 void Resizable_rubber_band::mousePressEvent(QMouseEvent *event)
 {
    lastPoint = event->pos();
    rubberband->childAt(lastPoint);
 }

 void Resizable_rubber_band::mouseReleaseEvent(QMouseEvent *event)
 {
   newpoint = event->pos();
   int dragx=newpoint.x()-lastPoint.x();
   int dragy=newpoint.y()-lastPoint.y();
   band->move(0+dragx,0+dragy);
 }

In this code, my problem is i am not getting the exact coordinates after dragging

thanks.

Ashish


Solution

  • Here is a quick example I made where you can move a QRubberBand using mouse events:

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QRubberBand>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    protected:
        void mousePressEvent(QMouseEvent *e);
        void mouseMoveEvent(QMouseEvent *e);
        void mouseReleaseEvent(QMouseEvent *e);
    
    private:
        Ui::MainWindow *ui;
        QRubberBand *rubberBand;
        bool move_rubberband;
        QPoint rubberband_offset;
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMouseEvent>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        move_rubberband = false;
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
        rubberBand->setGeometry(0,0,50,50);
        rubberBand->show();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::mousePressEvent(QMouseEvent *e)
    {
        if(rubberBand->geometry().contains(e->pos()))
        {
            rubberband_offset = e->pos() - rubberBand->pos();
            move_rubberband = true;
        }
    }
    
    void MainWindow::mouseMoveEvent(QMouseEvent *e)
    {
        if(move_rubberband)
        {
            rubberBand->move(e->pos() - rubberband_offset);
        }
    }
    
    void MainWindow::mouseReleaseEvent(QMouseEvent *e)
    {
        move_rubberband = false;
    }