Problem z fitInView(...)
-
Witam!
Mam taki oto kod, którym chce wyświetlić dwa obrazy w QGraphicsView:
@QImage obraz1(s1);
obraz1.scaled(QSize(541,541), Qt::IgnoreAspectRatio, Qt::FastTransformation);
update();
resize(541, 541);
QGraphicsScene *scena1 = new QGraphicsScene(ui->graphicsViewWynik);
QPixmap mapaPikseli1(n1);
scena1->addPixmap(mapaPikseli1);
ui->graphicsViewWynik->setScene(scena1);
ui->graphicsViewWynik->fitInView(scena1->itemsBoundingRect(), Qt::KeepAspectRatio);QImage obraz2(s2); obraz2.scaled(QSize(541,541), Qt::IgnoreAspectRatio, Qt::FastTransformation); update(); resize(541, 541); QGraphicsScene *scena2 = new QGraphicsScene(ui->graphicsViewWynik); QPixmap mapaPikseli2(n2); scena2->addPixmap(mapaPikseli2); ui->graphicsViewWynik->setScene(scena2); ui->graphicsViewWynik->fitInView(scena2->itemsBoundingRect(), Qt::KeepAspectRatio); [...] ui->graphicsViewWynik->show();@
Wszystko było by dobrze tyle że kontrolka graphicsViewWynik jest rozmiarów 541x541 a zdjęcie wyświetla się w rozmiarach ok 100x100 na środku pola. Do tego wszystkiego ten sam kod w innej formatce działa prawidłowo tzn. skaluje ładowane zdjęcie do maksymalnych rozmiarów kontrolki i je wyświetla. Kiedy wywalam linijkę z funkcją fitInView to zdjęcia wyświetlają się w oryginalnych rozmiarach (bez dopasowania do granic kontrolki).
Czyżby problemem tutaj było wyświetlenie dwóch scen "na sobie"? Chce ustawić w tych dwóch zdjęciach przezroczystość na poziomie 50% i dlatego muszę nałożyć na siebie dwie sceny.
-
To znowu ja :D Poczytałem trochę o poziomach przezroczystości w obrazach itp itd. Wnioskując ze źródeł, należy to zrobić za pomocą QPainter'a gdzie do nowego tymczasowego pliku można wpisać dwa obrazy z odpowiednim poziomem przezroczystości. Toteż tak oto poczyniłem:
@QImage obraz1(s1);
QImage obraz2(s2);
QImage *obrazWynikowy = new QImage("C:\temp.jpg");
QPainter porownywanie;porownywanie.begin(obrazWynikowy); porownywanie.setOpacity(0.5); porownywanie.drawImage(0, 0, obraz1); porownywanie.drawImage(0, 0, obraz2); porownywanie.end(); [...] ui->graphicsViewWynik->show();@
Raj na ziemi temu, kto się na tym wyzna i powie gdzie leży rozwiązanie lub po prostu co robię źle?
Pliku temp.jpg nie mam fizycznie w komputerze, ale wydaje mi się, że poprzez taki zapis powinien zostać stworzony i obrazy powinny być do niego wpisane chyba że się mylę?
-
Czy ktoś z was mógł by chociaż wskazać kierunek, w który powinienem sie kierowac chcąc wyświetlić dwa obrazy "na sobie" z odpowiednią przezroczystością aby udało się dostrzec różnice? Czy pierwszy sposób z wyświetleniem dwóch scen czy może drugi - z zapisem do pliku - jest trafniejszy?
-
No to może inaczej. Czy komuś z was kiedyś udało się nałożyć na siebie dwa obrazy z odpowiednim poziomem przezroczystości? Ja kombinuje, szukam, dokształcam się i mimo drugiego przedstawionego tutaj sposobu, który powinien wydawać się prawidłowy nie mogę uzyskać w żaden sposobów efektu, który mnie interesuje.
-
Ok. Poradziłem sobie już z tym wyświetlaniem "na sobie". Dla potomności Zarówno obiekt sceny (QGraphicsScene) oraz efektów (QGraphicsOpacityEffect w moim przypadku) w obrębie jednego widgetu QGraphicsView może być stworzony jeden raz, ale używany już wielokrotnie, dla różnych pixmapItem'ów. W związku z tym działający kod wygląda nastepująco:
@QGraphicsScene *scenaWynikowa = new QGraphicsScene(ui->graphicsViewWynik);
ui->graphicsViewWynik->setScene(scenaWynikowa);
ui->graphicsViewWynik->fitInView(scenaWynikowa->itemsBoundingRect(), Qt::KeepAspectRatio);QGraphicsOpacityEffect *poziomPrzezroczystosci = new QGraphicsOpacityEffect();
poziomPrzezroczystosci->setOpacity(0.5);QImage obraz1(s1);
obraz1.scaled(QSize(ui->graphicsViewWynik->width(), ui->graphicsViewWynik->height()), Qt::IgnoreAspectRatio, Qt::FastTransformation);
update();
resize(ui->graphicsViewWynik->width(), ui->graphicsViewWynik->height());
QPixmap mapaPikseli1(n1);
QGraphicsPixmapItem *pixmapItem1 = scenaWynikowa->addPixmap(mapaPikseli1);
QImage obraz2(s2);
obraz2.scaled(QSize(ui->graphicsViewWynik->width(), ui->graphicsViewWynik->height()), Qt::IgnoreAspectRatio, Qt::FastTransformation);
update();
resize(ui->graphicsViewWynik->width(), ui->graphicsViewWynik->height());
QPixmap mapaPikseli2(n2);
QGraphicsPixmapItem *pixmapItem2 = scenaWynikowa->addPixmap(mapaPikseli2);pixmapItem1->setGraphicsEffect(poziomPrzezroczystosci);
pixmapItem2->setGraphicsEffect(poziomPrzezroczystosci);
pixmapItem2->moveBy(0, 0);ui->graphicsViewWynik->show();@