【问题标题】:QGraphicsScene::removeItem: item scene is different from this sceneQGraphicsScene::removeItem: 项目场景与这个场景不同
【发布时间】: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


【解决方案1】:

终于找到了。

它在Game::FixedUpdate() 函数中,它的Player->collidesWithItem(enemy)true,即使在指针从场景中移除之后也是如此。因此,我在检查碰撞之前进行了检查,如下所示:

void Game::FixedUpdate(){
    if(Player->scene() != NULL && enemy->scene() != NULL){
        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();

        }
    }
}

删除后不给出消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多