QGraphicsOpacityEffect nie modyfikuje obrazów

0

Witam!

W QGraphicsView wyświetlam dwa obrazy "na sobie" jednak chce aby zarówno jeden jak i drugi były w połowie przezroczyste (wartość Opacity ustawiona na 0.5) tak aby można było dostrzec różnice, jednak poniższy kod nie daje takiego efektu :/

    QGraphicsScene *scenaWynikowa = new QGraphicsScene(ui->graphicsViewWynik);
    ui->graphicsViewWynik->setScene(scenaWynikowa);
    ui->graphicsViewWynik->fitInView(scenaWynikowa->itemsBoundingRect(), Qt::KeepAspectRatio);

    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);
    QGraphicsOpacityEffect poziomPrzezroczystosci1 = new QGraphicsOpacityEffect();
    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);
    QGraphicsOpacityEffect poziomPrzezroczystosci2 = new QGraphicsOpacityEffect();

    poziomPrzezroczystosci1.setOpacity(0.5);
    pixmapItem1->setGraphicsEffect(&poziomPrzezroczystosci1);
    poziomPrzezroczystosci2.setOpacity(0.5);
    pixmapItem2->setGraphicsEffect(&poziomPrzezroczystosci2);
    //pixmapItem2->moveBy(0, mapaPikseli1.height()-250);  //przesunięcie obrazu drugiego w dół dla testów

    ui->graphicsViewWynik->show();

W metodzie, w której znajduje się ten kod nie ma już żadnej innej linijki (to tak w woli wyjaśnienia że problem tkwi wyłącznie w przedstawionych wyżej linijkach). Co może być źle? Jakieś pomysły?

0

a dlaczego nie użyłeś QGraphicsItem::setOpacity w tym wypadku użycie QGraphicsOpacityEffect jest przerostem formy nad treścią.

1
QGraphicsOpacityEffect poziomPrzezroczystosci2 = new QGraphicsOpacityEffect();

nie powinno być?

QGraphicsOpacityEffect * poziomPrzezroczystosci2 = new QGraphicsOpacityEffect();

?

Kolejna rzecz o którą co prawda nie pytałeś ale w tym wypadku warto wiedzieć że

pixmapItem2->setGraphicsEffect(&poziomPrzezroczystosci2);

setGraphicsEffect przekazuje odpowiedzialność za usuniecie obiektu QGraphicsOpacityEffect na obiekt na rzecz którego został wywołany więc uważaj żeby go nie zwolnic drugi raz ręcznie bo będziesz miał problem.

0

@emacs: dobre spostrzeżenie!
W kodzie Qt JEST BŁĄD. Przed konstruktorem brakuje słowa kluczowego explicit więc ten błędny kod się kompiluje.
Operator new tworzy nowy efekt, a następnie brak słowa explicit powoduje użycie konstruktora jak operatora konwersji co w tym wypadku nie powinno mieć miejsca!
Nie dość, że w ten sposób robi się wyciek pamięci to na dodatek efekt nie działa.

Jak będę miał czas to wrzucę patcha do gitorious-a.

0

Problem został rozwiązany. Rozwiązaniem jego było to iż dla jednego QGraphicsView nie można tworzyć dwóch zmiennych tego samego efektu (tutaj dla OpacityEffect). Natomiast można potem tą zmienna przypisywać do wielu obiektów PixmapItem czego efekt jest tak naprawde ten sam.

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

Mała poprawka, bo zaraz zostane obrzucony błotem pewnie :/ Chodzi o to, że oczywiście wiele zmiennych efektów można tworzyć, jednak jeśli np. w moim przypadku ustawiam tą samą przezroczystość opacity dla dwóch obiektów to nie jest potrzebne tworzenie dwóch odrębnych zmiennych QGraphicsOpacityEffect z taką samą wartością Opacity bo raz, że kompilator nie chce tego skompilować, a dwa że nie jest to poprawne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1