2010-03-22 26 views
5

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())); 

} 

Respuesta

1

¿Quieres sceneRect no sólo width y height. Para escalar en el cambio de tamaño, quiere conectar una ranura al sceneRectChanged para que pueda cambiar el tamaño de la imagen cada vez que la escena cambie de tamaño.

O puede derivar una QGraphicsView con un sobrescrito updateSceneRect que cambia el tamaño de la imagen, o mejor aún, simplemente anular drawBackground.

+0

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

0

He encontrado ui->graphicsView->viewport()->size() para obtener el tamaño de la ventana gráfica. Solo funciona después de que se haya dibujado el widget.

0

El QGraphicsView::fitInView hace exactamente esto. De acuerdo con la documentación, comúnmente se pone en un resizeEvent. Usando sceneRects hace que toda la escena encaja en la vista:

void CustomGraphicsView::resizeEvent(QResizeEvent *) 
{ 
    this->fitInView(this->sceneRect()); 
} 
Cuestiones relacionadas