Показать два изображения в одном QGraphicsView

0

Это мой первый пост здесь, и я хотел бы сказать 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), и он отлично работает, но изображения должны иметь уровень непрозрачности, чтобы сделать эффект диффузии. Как я должен это делать?

Теги:
image
qt
qgraphicsview
opacity

2 ответа

1
Лучший ответ

Причина, по которой он не работает, заключается в том, что вы пытаетесь использовать два разных 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);
  • 0
    Хорошо, большое спасибо за быстрый ответ, но ... я изменил свой код в соответствии с вашими советами, и этот код все еще не работает: / Теперь у меня есть одна сцена и два элемента изображения, но в QGraphicsView (после сборки) я вижу только pixmapItem2. Этот эффект был и до модификации формы вашего ответа тоже. В этом методе нет другого кода. В чем дело?
  • 0
    @ user3346580 Можете ли вы отредактировать свой вопрос и добавить к нему новый код?
Показать ещё 5 комментариев
0

ОК. Спасибо @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();
  • 0
    Каждый QGraphicsPixmapItem может иметь свой собственный QGraphicsOpacityEffect . Вы не ограничены только одним.
  • 0
    Я отредактировал свой ответ, чтобы указать на это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню