2010-03-22 22 views
5

Mi piacerebbe avere un'immagine di sfondo nel mio QGraphicsView che sia sempre ridimensionata (e ritagliata se necessario) alla dimensione del viewport, senza barre di scorrimento e senza scorrere con la tastiera e il mouse. L'esempio che segue è quello che sto facendo per ridimensionare e ritagliare un'immagine nel viewport, ma sto usando valori casuali per il ritaglio che sono estratti dall'etere. Vorrei una soluzione logica?QGraphicsView scrolling e ridimensionamento immagine/ritaglio

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

Vorrei conoscere un modo per scalare e ritagliare un'immagine alle dimensioni del QGraphicsView che funziona anche quando ho ridimensionare il QGraphicsView. Da dove vengono i numeri 1.5 e 19?

MODIFICA; Ho anche provato a utilizzare setBackgroundBrush, ma ottengo uno sfondo affiancato, anche quando si utilizza QImage/QPixmap ridimensionato/ritagliato.

MODIFICA; La mia soluzione finora è stata quella di scavalcare drawBackground() per ottenere il risultato che volevo, ma questo non mi aiuta ancora a imparare come dimensionare un'immagine alla dimensione della vista di una qgraphicsview. Ogni ulteriore risposta sarebbe molto apprezzata.

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

} 

risposta

1

Non vuoi sceneRect solo width e height. Per il ridimensionamento su ridimensionamento, collegare lo slot a sceneRectChanged in modo da poter ridimensionare l'immagine ogni volta che la scena cambia dimensione.

Oppure è possibile derivare un QGraphicsView con un valore updateSceneRect sostituito che modifica la dimensione dell'immagine, o meglio ancora, basta sostituire drawBackground.

+0

Dalla documentazione: "Il rect scena definisce l'estensione della scena, e nel caso della vista, questo significa che l'area della scena che si può navigare utilizzando le barre di scorrimento. " sceneRect non è quello che voglio, che mi dà la dimensione della scena, indipendentemente da quali siano le dimensioni del viewport. Voglio le dimensioni del viewport. Voglio ridimensionare un'immagine a quelle dimensioni. Questo sembra semplice; prendi la larghezza/altezza di qgraphicsview e il lavoro dovrebbe essere fatto. Ma la larghezza e l'altezza non sono corrette quando ridimensiono un'immagine a quella dimensione: qual è la parte mancante qui? Proverò drawBackground. – user298725

0

Ho trovato ui->graphicsView->viewport()->size() per ottenere le dimensioni del viewport. Funziona solo dopo che il widget è stato disegnato però.

0

Il QGraphicsView::fitInView fa esattamente questo. Secondo la documentazione, è comunemente inserito in un resizeEvent. Utilizzando sceneRects rende l'intera forma scena nella vista:

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