Qt5 C++ QGraphicsView:las imágenes no se ajustan al marco de vista

 C Programming >> Programación C >  >> Tags >> Qt
Qt5 C++ QGraphicsView:las imágenes no se ajustan al marco de vista

La solución para mi pregunta es showEvent() para Dialog. Esto significa que no puede llamar a fitInView() antes de que se muestre el formulario, por lo que debe crear showEvent() para el diálogo y la imagen se ajustará al marco de QGraphics View.

Y el código de ejemplo que debe agregar al código del diálogo:

void YourClass::showEvent(QShowEvent *) {
    ui->graphicsView->fitInView(scn->sceneRect(),Qt::KeepAspectRatio);
}

La razón por la que no está viendo su imagen como desea es porque la función fitInView de QGraphicsView no hace lo que cree que hace.

Garantiza que el objeto se ajuste dentro de la ventana gráfica, sin superposición de los bordes de la vista, por lo que si su objeto no estaba en la vista, llamar a fitInView hará que la vista se mueva / escale, etc. para garantizar que el objeto sea completamente visible. Además, si la ventana gráfica es demasiado pequeña para el área proporcionada para caber en la vista, no pasará nada.

Por lo tanto, para obtener lo que desea, asigne las extensiones de las coordenadas de GraphicsView a GraphicsScene y luego establezca las coordenadas de la escena de la imagen en ellas. Como dijo @VBB, si estira la imagen, puede cambiar la relación de aspecto, por lo que puede usar scaledToWidth en QPixmap.

Algo como esto:-

QRectF sceneRect = ui->graphicsView->sceneRect(); // the view's scene coords
QPixmap image = QPixmap::fromImage(*image);

// scale the image to the view and maintain aspect ratio
image = image.scaledToWidth(sceneRect.width());

QGraphicsPixmapItem* pPixmap = scn->addPixmap(QPixmap::fromImage(*image));

// overloaded function takes the object and we've already handled the aspect ratio
ui->graphicsView->fitInView(pPixmap);

Es posible que descubras que no necesitas la llamada a fitInView, si tu ventana gráfica está en el lugar correcto y si no quieres que se vea pixelada, usa una imagen con una resolución alta.