2013-06-10 16 views
13

Sto lavorando a un programma che mostra all'utente alcune immagini selezionate da lui. Ma c'è un problema perché mi piacerebbe inserire questa immagine nel frame di QGraphicsView e l'immagine è molto più piccola della cornice.Qt5 C++ QGraphicsView: le immagini non si adattano al riquadro di vista

Quindi, ecco il mio codice:

image = new QImage(data.absoluteFilePath()); // variable data is defined when calling this method 
scn = new QGraphicsScene(this); // object defined in header 
ui->graphicsView->setScene(scn); 
scn->addPixmap(QPixmap::fromImage(*image)); 
ui->graphicsView->fitInView(scn->itemsBoundingRect(),Qt::KeepAspectRatio); 

stavo provando un sacco di soluzioni che ho trovato sul web, ma nessuno non mi ha aiutato. L'immagine è di dimensioni intorno a 40 x 60 px quando il frame è di 200 x 400 px. Cosa potrebbe esserci di sbagliato?

Ecco alcuni esempi di ciò che viene prodotto con codice di cui sopra e quello che voglio uscire: enter image description here

+0

posso riprodurre questo comportamento L'immagine viene ridimensionata perfettamente. –

+0

Si prega di guardare la domanda modificata. Grazie! – user1257255

+0

So che non è il problema ma se allunghi così tanto le immagini, sarò un po 'brutto ... inoltre, vuoi mantenere le proporzioni che non sono le stesse (l'immagine è 2/3 e il fotogramma è 1/2 ...) Forse con un frame 200 * 300? –

risposta

16

Soluzione per la mia domanda è showEvent() per Dialog. Ciò significa che non è possibile chiamare fitInView() prima che venga mostrato il modulo, quindi è necessario creare showEvent() per la finestra di dialogo e l'immagine verrà adattata al frame di QGraphics View.

E esempio di codice che si deve aggiungere nel codice della finestra di dialogo:

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

Gesù Cristo! Grazie amico! Ho cercato tutta la documentazione Qt per cercare di capire il problema e non ha un riferimento per questo problema! – emanuelcds

+1

Ho avuto un problema dopo questo, come hai risolto il problema del bordo del pixel bianco?Ho un QDeclarativeView (che è un GraphicsView) e sto cercando di adattare InView per la scena() -> itemsBoundingBox() che risulta in 1920x1080 pixel. Anche se rimane con un bordo bianco di 5 pixel (a causa del colore di sfondo della scena). Se faccio un setAlign (Qt :: Left | Qt :: Top) viene visualizzato solo il margine in basso a destra. Qualche suggerimento? – emanuelcds

0

Il motivo non riesci a vedere l'immagine come si desidera, è perché la funzione QGraphicsView fitInView non lo fa fai quello che pensi che faccia.

Assicura che l'oggetto si adatti al viewport, senza alcuna sovrapposizione dei bordi della vista, quindi se l'oggetto non era nella vista, la chiamata fitInView causerà lo spostamento/ridimensionamento della vista per garantire che l'oggetto è completamente visibile. Inoltre, se il viewport è troppo piccolo per l'area fornita per fitInView, non accadrà nulla.

Quindi, per ottenere ciò che si desidera, mappare le estensioni delle coordinate di GraphicsView a GraphicsScene e quindi impostare le coordinate della scena dell'immagine su quelle. Come ha detto @VBB, se si allunga l'immagine, è possibile che cambi aspetto, quindi è possibile utilizzare ridimensionato su QPixmap.

Qualcosa di simile a questo: -

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

Potreste scoprire che non è necessario la chiamata alla fitInView, se la vostra finestra è nel posto giusto e se non si vuole farlo sembrare pixelizzate, usa un'immagine ad alta risoluzione.

0

Si dovrebbe gestire ridimensionare evento, credo che sia il modo in cui è fatto per essere giocato:

bool YourDialog::eventFilter(QObject *obj, QEvent *event) 
{ 
     if (event->type() == QEvent::Show){ 
      ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio); 
     } 

     if (event->type() == QEvent::Resize){ 
      ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio); 
     } 
}