【发布时间】:2015-01-08 00:02:47
【问题描述】:
QGraphicsScene::removeItem 有点奇怪,当我从场景中移除两个项目时,我收到以下消息:
QGraphicsScene::removeItem: item 0x5edb28's scene (0x0) is different from this scene (0x5e7790)
QGraphicsScene::removeItem: item 0x5edc18's scene (0x0) is different from this scene (0x5e7790)
即使这两个项目在场景中。
我已经根据场景检查了项目场景,但它返回 true:
if(Player->scene() == m_scene){
m_scene->addText("Same"); // this text is added
}else{
m_scene->addText("Different");
}
m_scene来自这个班级:
class Game : public QGraphicsView
{
Q_OBJECT
public:
Game();
public slots:
void FixedUpdate();
signals:
private:
QRectF *sceneSize;
QGraphicsScene *m_scene;
QGraphicsRectItem *m_rect;
QTimer *m_timer;
Character *Player;
Character *enemy;
};
而Character类是继承自QGraphicsPolygonItem的类:
class Character : public QObject, public QGraphicsPolygonItem
{
Q_OBJECT
public:
Character(qreal x, qreal y, qreal w, qreal h, QString tag, QGraphicsScene *scene = 0, QGraphicsItem *parent = 0);
Character(QRectF rectF, QString tag, QGraphicsScene *scene = 0, QGraphicsItem *parent = 0);
Character(QString tag, QGraphicsScene *scene = 0, QGraphicsItem *parent = 0);
void setValue(qreal x, qreal y, qreal w, qreal h);
void setVelocity(qreal vx, qreal vy);
void setVelocityX(qreal vx);
void setVelocityY(qreal vy);
void setTag(QString tag);
qreal vx() const;
qreal vy() const;
qreal w() const;
qreal h() const;
QString tag() const;
QGraphicsScene *currentScene() const;
void fixedUpdate();
void removeCharacter();
signals:
public slots:
private:
qreal m_x;
qreal m_y;
qreal m_w;
qreal m_h;
qreal m_vx;
qreal m_vy;
QString m_tag;
QGraphicsScene *m_scene;
};
这就是我打电话给removeItem的地方
void Game::FixedUpdate(){
if(Player->collidesWithItem(enemy)){
Player->setVelocityX(0);
enemy->setVelocityX(0);
//removeCharacter just call scene()->removeItem(this);
Player->removeCharacter();
enemy->removeCharacter();
}else{
Player->fixedUpdate();
enemy->fixedUpdate();
}
}
谁能解释一下为什么我会收到这些消息?
编辑:
Game::Game(){
sceneSize = new QRectF(0, 0, 640, 480);
m_scene = new QGraphicsScene(*sceneSize, this);
setScene(m_scene);
Player = new Character(QRectF(0, 0, 50, 50), "player", m_scene);
Player->setVelocityX(1.5);
//m_scene->addItem(Player);
enemy = new Character(QRectF(500, 0, 20, 20), "enemy", m_scene);
enemy->setVelocityX(-0.5);
//m_scene->addItem(enemy);
//m_scene->addText(QString::number(Player->x() + Player->vx()));
if(Player->scene() == m_scene){
m_scene->addText("Same");
}else{
m_scene->addText("Different");
}
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(FixedUpdate()));
m_timer->start(1000 / 60);
}
【问题讨论】:
-
您的程序中是否有多个
QGraphicsScene?另外,为什么你的Character类有一个m_scene指针?当前显示的场景已经存储在QGraphicsPolygonItem -
@Bowdzone,我只有一个,在
Game类中。我已经用它来检查来自Character的场景m_scene和来自其父级的场景scene()是否相同(它们是相同的)。 -
哦,我读错了……当您致电
removeItem时,他们会被删除并且您收到消息还是删除不起作用?如果有效,是否可以调用 remove 两次? -
"item 0x5edb28's scene (0x0) " 0x0 是场景的地址,所以它告诉你这个 item 的场景已经是 NULL。我怀疑问题出在您尚未在此处发布的代码中。您是否也删除该项目?如果是这样,它将自动从场景中删除,并且可能在此处发生冲突。如果调用 removeItem 的函数是从插槽调用的,请检查是否只存在一个到该插槽的连接。
-
抱歉回复晚了...
标签: c++ qt qgraphicsview qgraphicsscene