Qt更新QGraphicsPixmapItem的像素图

4

我正在使用QGraphicsPixmapItem在显示器上显示图片。现在,我希望能够动态更新这个图片,但是似乎遇到了一些问题。

这是头文件

class Enemy_View : public QGraphicsPixmapItem
{
public:
    Enemy_View(QGraphicsScene &myScene);
    void defeat();
private:
    QGraphicsScene &scene;
    QPixmap image;
}

这里是cpp文件。

Enemy_View::Enemy_View(QGraphicsScene &myScene):
    image{":/images/alive.png"}, scene(myScene)
{
    QGraphicsPixmapItem *enemyImage = scene.addPixmap(image.scaledToWidth(20));
    enemyImage->setPos(20, 20);
    this->defeat();
}

void Enemy_View::defeat(void)
{
    image.load(":/images/dead.png");
    this->setPixmap(image);
    this->update();
}

所以我的想法是在对象上调用defeat方法,然后编辑一些属性并最终更改图像。然而,我现在做的事情不起作用。 alive.png 图像显示出来了,但没有更新为dead.png


更新1

正如Marek R所提到的,我似乎复制了很多内置功能。我试图清理这个问题,但现在场景中什么都没有显示出来了。

.h 文件

class Enemy_View : public QGraphicsPixmapItem
{
public:
    Enemy_View(QGraphicsScene &myScene);
    void defeat();

private:
    QGraphicsScene &scene;
    /* Extra vars */
};

.cpp文件

Enemy_View::Enemy_View(QGraphicsScene &myScene):
    scene(myScene)
{
    /* This part would seem ideal but doesn't work */
    this->setPixmap(QPixmap(":/images/alive.png").scaledToWidth(10));
    this->setPos(10, 10);
    scene.addItem(this);

    /* This part does render the images */
    auto *thisEl = scene.addPixmap(QPixmap(":/images/Jackskellington.png").scaledToWidth(10));
    thisEl->setPos(10, 10);
    scene.addItem(this);

    this->defeat();
}

void Enemy_View::defeat(void)
{
    this->setPixmap(QPixmap(":/images/dead.png"));
}

我已经移除了QPixmap,但我不确定是否可以移除QGraphicsScene。在我的cpp文件中,你可以看到我现在有两个版本的构造函数。第一个部分使用this似乎是一个理想的解决方案,但是没有将图像显示在屏幕上(虽然它确实可以编译而没有错误)。带有thisEl的第二个版本确实可以渲染它。我在第一个版本中做错了什么?


为什么你要继承QGraphicsPixmapItemQGraphicsPixmapItem已经拥有了你所需要的所有功能。而且你添加的那些新字段并没有起到任何作用,它们只是试图复制已经存在的功能(但是这种实现方式却没有任何作用)。 - Marek R
你如何将你的 Enemy_View 添加到场景中? - thuga
@thuga:我猜这应该在构造函数中完成,还是应该在调用构造函数的类中完成? - jdepypere
@arbitter 我会在创建对象的类中完成这件事。 - thuga
1个回答

4

为什么你要继承QGraphicsPixmapItemQGraphicsPixmapItem已经有了你需要的所有功能。而你添加的新字段没有任何作用,它们只是试图复制已经存在的功能(但这种实现方式并没有起到任何作用)。

应该像这样:

QPixmp image(":/images/alive.png");
QGraphicsPixmapItem *enemyItem = scene.addPixmap(image.scaledToWidth(20));
enemyItem->setPos(20, 20);

// and after something dies
QPixmap dieImage(":/images/dead.png");
enemyItem->setPixmap(dieImage);

我正在使用子类,因为我需要同时更新模型,但我省略了那部分代码。我不太确定如何在不复制大量代码的情况下显示具有特定位置的图像QGraphicsScene。我已经更新了我的答案以反映我所做的更改。 - jdepypere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接