Question

I'm trying to creat a Dicom GUI Toolkit where the user selects some dicom images and the image of first dicom image from the selected ones will be shown. Then the user clicks on the image and the image pops out with bigger image window. In this shown bigger image, the image will consist of a red colored rectangle that contains necessary regions of the Dicom image while the unnecessary region is outside the rectangle. The user should then have the option to change the rectangle by mouse.

Until now, I have been able to show the big dicom image with the rectangle in it using QLabel which is by the following code snippets.

void MainWindow::showBigImage()
{
    QPixmap bigimage;
    bigimage.load(imageName.c_str());
    QPainter painter(&bigimage);
    painter.setPen(Qt::red);
    QRectF rect(xmin, ymin, xmax, ymax);
    painter.drawRect(rect);
    QSize bigsize = ui->bigImageLabel->size();
    ui->bigImageLabel->setPixmap(bigimage.scaled(bigsize, Qt::IgnoreAspectRatio, Qt::FastTransformation));
    ui->bigImageLabel->show();
}

and the big image on the app looks like the following:

enter image description here

Can you please suggest me how I should now make the rectangle editable by the user where the user can set the existing red rectangle as per his or her wish?

I also tried similar thing using QGraphicsView and QGraphicsScene with the following code:

void MainWindow::showBigImage()
{
    QGraphicsScene* scene = new QGraphicsScene;
    scene->addPixmap(bigimage);
    ui->bigImageView->setScene(scene);
    ui->bigImageView->show();
}

And this code gives me the following look:

enter image description here

As you can see, I could not fit the image to the boundaries of QGraphicsView, could you suggest me how to do it? Could you also suggest me how to add the red rectangle(that I showed in the example using QLabel) on the QGraphicsView without adding the rectangle on the QPixmap?

Was it helpful?

Solution

In order to get the red selection rectangle, Qt provides the class QRubberBand. The docs state:

The QRubberBand class provides a rectangle or line that can indicate a selection or a boundary.

By subclassing the image object and implementing the mouse handling functions, to create the rubber band on mousePressEvent, update its position on mouseMoveEvent and grab its final rect on mouseReleaseEvent, the QRubberBand will simplify the problem.

If you want the QRubberBand to show all the time, just create it when you display the enlarged image and don't hide it on releasing the mouse button.

As for displaying the image in the QGraphicsView, the code you displayed doesn't set the geometry of the QGraphicsScene and QGraphicsView, so you're seeing a border. If you don't want that, you should set them accordingly. Also note that QGraphicsView has a function fitInView, which you could use, after having retrieved an area from the QRubberBand, in order to zoom into the selected area.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top