我正在使用QGraphicsPixmapItem在显示器上显示图像。现在,我希望能够即时更新此镜像,但是似乎遇到了一些问题。
这是 header 文件:
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。更新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
-file中,您可以看到我现在有两个版本的构造函数。第一部分,使用this
似乎是一个理想的解决方案,但是不会在屏幕上显示图像(即使它确实编译没有错误)。带有thisEl
的第二个版本会渲染它。我的第一个版本有什么问题? 最佳答案
为什么将FGS子类化为QGraphicsPixmapItem
? QGraphicsPixmapItem
具有您需要的所有功能。并且您添加的那些新字段什么也不做,它们只会尝试复制已经存在的功能(但是通过此实现,它什么也不做)。
这应该是这样的:
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);