Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

cropping image on QLabel using mouseEvent



  • Hi ,,,i need to crop image displayed on label after dragging ,image is disappearing from the QLabel,, can anybody pls help me to fix this issue ??
    i added this code

    
    void MainWindow::mousePressEvent(QMouseEvent *ev)
    {
    if(ui->label->underMouse())
    {
       //qDebug()<<"Entered Press";
        origin = ev->pos();
    
        if (!rubberBand)
            rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    
            rubberBand->show();
    
    }
    }
    
    void MainWindow::mouseMoveEvent(QMouseEvent *ev)
    {
    
    rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
    }
    
    void MainWindow::mouseReleaseEvent(QMouseEvent *ev)
    {
    QPoint a = mapToGlobal(origin);
    QPoint b = ev->globalPos();
    
    a = ui->label->mapFromGlobal(a);
    b = ui->label->mapFromGlobal(b);
    rubberBand->hide();
    QPixmap OriginalPix(*ui->label->pixmap());
    double sx = ui->label->rect().width();
    double sy = ui->label->rect().height();
    sx = OriginalPix.width() / sx;
    sy = OriginalPix.height() / sy;
    
    a.setX(int(a.x() * sx));
    b.setX(int(b.x() * sx));
    a.setX(int(a.x() * sy));
    b.setX(int(b.x() * sy));
    
    
    QRect myRect(a,b);
    
    QImage newImage;
    newImage = OriginalPix.toImage();
    
    QImage copyImage;
    copyImage = copyImage.copy(myRect);
    
    ui->label->setPixmap(QPixmap::fromImage(copyImage));
    ui->label->repaint();
    
    }
    


  • QLabel is the wrong instrument for the job. have a look at this example: https://evileg.com/en/post/272/


  • Lifetime Qt Champion

    Hi
    I think you used the wrong image by accident

    you say

    QImage newImage;
    newImage = OriginalPix.toImage();
    QImage copyImage;
    copyImage = copyImage.copy(myRect); << copy empty

    i think you meant.

    QImage newImage;
    newImage = OriginalPix.toImage();
    QImage copyImage;
    copyImage = newImage.copy(myRect); << copy from newImage



  • @mjjj as u said i hv changed
    copyImage=newImage.copy(myRect);

    but here wat happens after dragged image,, its showing QLabel is completely black


  • Lifetime Qt Champion

    @Dimple
    you mean when you drag the image to be cropped to the label ?



  • yeah ,,after dragged the image ,,its showing QLabel is completely black (not shows image after cropped the image)



  • 0_1545661635737_img2.PNG

    0_1545661348348_img.PNG


  • Lifetime Qt Champion

    @Dimple
    I think the mapping of the coordinates are a bit off so the rect copied is outside
    the coordinates for label holding image.



  • can u please send me correct code ,,,im not getting


  • Lifetime Qt Champion

    @Dimple
    the calculations for the actual rect to copy

    a = ui->label->mapFromGlobal(a);
    b = ui->label->mapFromGlobal(b);
    
    double sx = ui->label->rect().width();
    double sy = ui->label->rect().height();
    
    sx = OriginalPix.width() / sx;
    sy = OriginalPix.height() / sy;
    
    a.setX(int(a.x() * sx));
    b.setX(int(b.x() * sx));
    a.setX(int(a.x() * sy));
    b.setX(int(b.x() * sy));
    
    QRect myRect(a, b); // im not sure this rect is as intended.
    

    try use qDebug to write it out and inspect the values.
    like
    qDebug() << " crop rect" << myRect;


  • Banned

    This post is deleted!


  • @mrjj

    a.setX(int(a.x() * sx));
    b.setX(int(b.x() * sx));
    a.setY(int(a.y() * sy));
    b.setY(int(b.y() * sy));

    QRect myRect(a,b);

    QImage newImage;
    newImage = OriginalPix.toImage();
    QImage copyImage;
    copyImage=newImage.copy(myRect);
    ui->label->setPixmap(QPixmap::fromImage(copyImage));
    ui->label->setScaledContents(true);
    ui->label->repaint();

    now its working ,,i can crop the image but after cropped the image ,,,if i click on cropped image ,,image is disappearing?


  • Lifetime Qt Champion

    @Dimple
    Hi
    clicking the label triggers mousePressEvent and mouseReleaseEvent
    so you will grab a very small /invalid area. ( thats my guess )



  • @mrjj said in cropping image on QLabel using mouseEvent:

    triggers

    ok i ll change some functionality ,,Thanks for ur help


  • Lifetime Qt Champion

    @Dimple
    Hi
    i imagine a bool flag to tell it its in crop mode , else it will just ignore the mosuePress code etc.



  • @mrjj

    ok i ll check it out,,,thanks


Log in to reply