2013-06-10 12 views
13

Pracuję nad programem, który pokazuje użytkownikowi wybrane przez niego zdjęcie. Ale jest problem, ponieważ chciałbym dopasować ten obraz do ramki QGraphicsView, a obraz jest naprawdę mniejszy niż ramka.Qt5 C++ QGraphicsView: Obrazy nie pasują do ramki widoku

Więc tutaj jest mój kod:

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

Próbowałam wiele rozwiązań, które znalazłem w internecie, ale nikt mi nie pomoże. Obraz ma rozmiar około 40 x 60 pikseli, gdy ramka ma wymiary 200 x 400 pikseli. Co może być nie tak?

Oto przykład tego, co jest produkowane z kodem powyżej i co chcę wyjść: enter image description here

+0

mogę odwzorowują to zachowanie. Obraz jest idealnie skalowany. –

+0

Proszę spojrzeć na edytowane pytanie. Dzięki! – user1257255

+0

Wiem, że to nie problem, ale jeśli rozciągniesz zdjęcia tak bardzo, będę trochę brzydka ... ponadto, chcesz zachować proporcje, która nie jest taka sama (obrazek to 2/3, a ramka to 1/2 ...) Może z ramą 200 * 300? –

Odpowiedz

16

Rozwiązaniem dla mojego pytania jest showEvent() dla okna dialogowego. Oznacza to, że nie można wywołać metody fitInView() przed wyświetleniem formularza, więc należy utworzyć okno dialogowe showEvent() dla okna dialogowego, a obraz zostanie wstawiony do ramki widoku QGraphics.

A przykład kodu, który musisz dodać do kodu okna dialogowego:

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

Jezus Chrystus! Dziękuje! Przeszukałem całą dokumentację Qt, aby spróbować zrozumieć problem i nie ma on odniesienia do tego problemu! – emanuelcds

+1

Miałem problem po tym, jak rozwiązałeś problem z białą ramką?Mam QDeclarativeView (który jest GraphicsView) i próby fitInView dla sceny() -> itemsBoundingBox(), który powoduje 1920 x 1080 pikseli. Chociaż pozostaje z 5-pikselową białą ramką (ze względu na kolor tła sceny). Jeśli wykonuję setAlign (Qt :: Left | Qt :: Top) wyświetlany jest tylko dolny prawy margines. Jakieś wskazówki? – emanuelcds

0

powód, dla którego nie widzisz obraz, jak chcesz to dlatego, że fitInView funkcja QGraphicsView nie rób to, co myślisz.

Zapewnia, że ​​obiekt mieści się wewnątrz rzutni, bez nakładania się obramowań widoku, więc jeśli obiekt nie był w widoku, wywołanie metody fitInView spowoduje przesunięcie widoku/skalowanie itp. W celu zapewnienia, że ​​obiekt jest całkowicie widoczny. Ponadto, jeśli obszar podglądu jest zbyt mały dla obszaru przewidzianego do dopasowania widoku, nic się nie stanie.

Aby uzyskać to, co chcesz, zmapuj zakres współrzędnych GraphicsView do GraphicsScene, a następnie ustaw współrzędne sceny obrazu. Jak powiedział @VBB, jeśli rozciągniesz obraz, może to zmienić aspekt raio, więc możesz użyć scaledToWidth na QPixmap.

coś takiego: -

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

może się okazać, że nie trzeba wywołanie fitInView, jeśli rzutnia jest we właściwym miejscu, a jeśli nie ma to wyglądać pixellated, użyj obrazu o wysokiej rozdzielczości.

0

Należy poradzić rozmiaru zdarzenie, myślę, że jest to sposób to ma być odtwarzane:

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); 
     } 
} 
Powiązane problemy