Me gustaría tener una imagen de fondo en mi QGraphicsView que siempre se escala (y recorta si es necesario) al tamaño de la ventana gráfica, sin barras de desplazamiento y sin desplazarse con el teclado y el mouse. El siguiente ejemplo es lo que estoy haciendo para escalar y recortar una imagen en la ventana gráfica, pero estoy usando valores aleatorios para el recorte que se extraen del éter. Me gustaría una solución lógica?QGraphicsView desplazamiento y escala/recorte de imagen
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->resize(800, 427);
// MainWindow is 800x480, GraphicsView is 800x427. I want an image that
// is the size of the graphicsView.
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// the graphicsView still scrolls if the image is too large, but
// displays no scrollbars. I would like it not to scroll (I want to
// add a scrolling widget into the QGraphicsScene later, on top of
// the background image.)
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(
QSize(ui->graphicsView->width(),
ui->graphicsView->height()),
Qt::KeepAspectRatioByExpanding); // This scales the image too tall
QImage sizedImage = QImage(sized.toImage());
QImage sizedCroppedImage = QImage(sizedImage.copy(0,0,
(ui->graphicsView->width() - 1.5),
(ui->graphicsView->height() + 19)));
// so I try to crop using copy(), and I have to use these values
// and I am unsure why.
QGraphicsPixmapItem *sizedBackground = scene->addPixmap(
QPixmap::fromImage(sizedCroppedImage));
sizedBackground->setZValue(1);
ui->graphicsView->setScene(this->scene);
}
me gustaría saber una manera de escalar y recortar una imagen al tamaño de la QGraphicsView que funcionará incluso cuando cambio el tamaño de la QGraphicsView. ¿De dónde vienen el 1.5 y el 19?
EDITAR; También he intentado usar setBackgroundBrush, pero obtengo un fondo de mosaico, incluso cuando uso el QImage/QPixmap escalado/recortado.
EDITAR; Mi solución ha sido hasta ahora para anular drawBackground() para obtener el resultado que quería, pero esto todavía no me ayudará a aprender cómo el tamaño de una imagen al tamaño de la ventana gráfica de un QGraphicsView. Cualquier otra respuesta sería muy apreciada.
void CustomGraphicsView::drawBackground(QPainter * painter, const QRectF & rect)
{
qDebug() << "background rect: " << rect << endl;
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(QSize(rect.width(), rect.height()), Qt::KeepAspectRatioByExpanding);
painter->drawPixmap(rect, sized, QRect(0.0, 0.0, sized.width(), sized.height()));
}
De la documentación: "La escena rect define el alcance de la escena, y en el caso de la vista, esto significa que el área de la escena que se puede navegar usando las barras de desplazamiento ". sceneRect no es lo que quiero, eso me da el tamaño de la escena, independientemente de las dimensiones de la ventana gráfica. Quiero las dimensiones de la ventana gráfica. Quiero ajustar el tamaño de una imagen a esas dimensiones. Esto parece simple; agarre el ancho/alto de la vista qgraphics y el trabajo debe hacerse. Pero el ancho y la altura no son correctos cuando escalo una imagen a ese tamaño: ¿cuál es la parte que falta aquí? Voy a tratar drawBackground. – user298725