Это мой первый пост здесь, и я хотел бы сказать Hello Everyone on stackoverflow :)
Хорошо, приветствую уже, и теперь я задаю проблему, которая у меня есть. У меня есть один виджет QGraphicsView, и я хочу показать два изображения с некоторой непрозрачностью в нем, но мой код не работает, и я не знаю, в чем причина:/
QGraphicsScene *scenaWynikowa = new QGraphicsScene(ui->graphicsViewWynik);
ui->graphicsViewWynik->setScene(scenaWynikowa);
ui->graphicsViewWynik->fitInView(scenaWynikowa->itemsBoundingRect(), Qt::KeepAspectRatio);
//wyświetlenie zdjęcia nr 1
QImage obraz1(s1);
obraz1.scaled(QSize(541,541), Qt::IgnoreAspectRatio, Qt::FastTransformation);
update();
resize(541, 541);
QPixmap mapaPikseli1(n1);
QGraphicsPixmapItem *pixmapItem1 = scenaWynikowa->addPixmap(mapaPikseli1);
QGraphicsOpacityEffect poziomPrzezroczystosci1;
poziomPrzezroczystosci1.setOpacity(0.5);
pixmapItem1->setGraphicsEffect(&poziomPrzezroczystosci1);
//wyświetlenie zdjęcia nr 2
QImage obraz2(s2);
obraz2.scaled(QSize(541,541), Qt::IgnoreAspectRatio, Qt::FastTransformation);
update();
resize(541, 541);
QPixmap mapaPikseli2(n2);
QGraphicsPixmapItem *pixmapItem2 = scenaWynikowa->addPixmap(mapaPikseli2);
QGraphicsOpacityEffect poziomPrzezroczystosci2;
poziomPrzezroczystosci2.setOpacity(0.5);
pixmapItem2->setGraphicsEffect(&poziomPrzezroczystosci2);
pixmapItem2->moveBy(0, 0);
ui->graphicsViewWynik->show();
Извините за не английские имена переменных, но это более удобно для меня. Если вы хотите, я могу объяснить, что и почему переменная имеет это имя :) Может быть, кто-то обнаружил ошибку в этом коде и объяснил мне, где проблема с моим кодом и как его исправить?
edit: Это мой новый код. Когда я перемещаю позицию pix2 в QGraphicsView, я вижу два изображения (pix2 под pix1), и он отлично работает, но изображения должны иметь уровень непрозрачности, чтобы сделать эффект диффузии. Как я должен это делать?
Причина, по которой он не работает, заключается в том, что вы пытаетесь использовать два разных QGraphicsScene
для QGraphicsView
. QGraphicsView
может иметь только одну сцену.
Что вы должны сделать, это создать только один QGraphicsScene
и добавить туда свои pixmaps.
QGraphicsScene *scene = new QGraphicsScene(this);
ui->graphicsScene->setScene(scene);
QPixmap pix1(n1);
QGraphicsPixmapItem *pixmapItem1 = scene->addPixmap(pix1);
QPixmap pix2(n2);
QGraphicsPixmapItem *pixmapItem2 = scene->addPixmap(pix2);
pixmapItem2->moveBy(0, pix1.height());
Также ваш объект QGraphicsOpacityEffect
действителен только внутри области, в которой вы его создали. Одним из способов решения этой проблемы является выделение ее new
.
QGraphicsOpacityEffect *opacity1 = new QGraphicsOpacityEffect;
QGraphicsOpacityEffect *opacity2 = new QGraphicsOpacityEffect;
opacity1->setOpacity(0.5);
opacity2->setOpacity(0.2);
pixmapItem1->setGraphicsEffect(opacity1);
pixmapItem2->setGraphicsEffect(opacity2);
ОК. Спасибо @thuga за вашу помощь. Проблема решена. Что случилось? Я устанавливал непрозрачность дважды двум другим переменным, но это была огромная ошибка. В QGraphicsView мы можем объявить переменную OpacityEffect только один раз и присвоить ее нескольким переменным - точно так же, как QGraphicsScene.
Последняя версия кода (отлично работает):
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();
QGraphicsPixmapItem
может иметь свой собственный QGraphicsOpacityEffect
. Вы не ограничены только одним.