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


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.