【问题标题】:Show two images in one QGraphicsView在一个 QGraphicsView 中显示两个图像
【发布时间】:2014-03-26 02:51:20
【问题描述】:

这是我在这里的第一篇文章,我想在 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();

对不起,不是英文变量的名称,但对我来说更方便。如果您愿意,我可以解释什么以及为什么变量具有该名称:) 也许有人发现这段代码有错误并向我解释我的代码的问题在哪里以及如何解决?

编辑:这是我的新代码。当我在 QGraphicsView 上移动 pix2 的位置时,我可以看到两个图像(pix2 在 pix1 下)并且效果很好,但是图像应该具有不透明度级别以产生扩散效果。我该怎么做?

【问题讨论】:

    标签: c++ image qt opacity qgraphicsview


    【解决方案1】:

    它不起作用的原因是因为您试图为您的QGraphicsView 使用两个不同的QGraphicsScenes。 QGraphicsView 只能有一个场景。

    你应该做的是只创建一个QGraphicsScene 并在那里添加你的像素图。

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

    【讨论】:

    • 好的,非常感谢您的快速回答,但是...我根据您的提示修改了我的代码,但此代码仍然不起作用:/ 现在,我有一个场景和两个像素图项,但是QGraphicsView(构建后)我只看到 pixmapItem2。这也是在修改您的答案之前的效果。在这个方法中,没有其他代码。怎么了?
    • @user3346580 你能编辑你的问题并添加你的新代码吗?
    • @user3346580 你移动你的pixmapItem2了吗?也许它就在你的pixmapItem1之上。
    • 我编辑了我的问题。看看这个话题,非常感谢你的帮助:)
    • @user3346580 您的pixmapItem2 似乎在pixmapItem1 之上。稍微移动一下。看看我是如何在我的代码 sn-p 中移动它的。
    【解决方案2】:

    好的。感谢@thuga 的帮助。问题已解决。哪里错了?我将 Opacity 两次设置为另外两个变量,但这是一个巨大的错误。在 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。您不仅限于一个人。
    • 当然,但是,这表明我不能非常先进,但也可以工作我必须仅限于一个,因为我想为两个图像分配一个不透明度级别。在其他情况下,它不会发生。我知道 :) 非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多