我對C++有點新,並且在確定爲什麼在下面的代碼中出現段錯誤時遇到了一些問題;嘗試訪問QGraphicsTextItem的成員時發生段錯誤
gamescene.h
#ifndef GAMESCENE_H
#define GAMESCENE_H
#include <QGraphicsScene>
class GameScene : public QGraphicsScene
{
Q_OBJECT
public:
explicit GameScene(QObject *parent = 0);
virtual void keyPressEvent(QKeyEvent*);
QGraphicsTextItem* p;
~GameScene();
signals:
public slots:
};
#endif // GAMESCENE_H
gamescene.cpp
#include "gamescene.h"
#include "QKeyEvent"
#include "QGraphicsTextItem"
#include "QGraphicsRectItem"
#include "QDebug"
#include "QGraphicsScene"
#include "QScopedPointer"
GameScene::GameScene(QObject *parent) :
QGraphicsScene(parent)
{
QGraphicsTextItem* p = new QGraphicsTextItem(QString("HEEEEE"));
p->setFlags(p->ItemIsMovable);
p->moveBy(qreal(500),qreal(500));
addItem(p);
}
void GameScene::keyPressEvent(QKeyEvent *event)
{
qDebug() << (p != NULL);
switch(event->key())
case (Qt::Key_W):
{
qreal x, y;
x = qreal(5);
y = qreal(5);
p->moveBy(x,y);
qDebug() << "move up";
}
}
GameScene::~GameScene() {
}
它的時候,我gamescene對象的keyPressEvent方法被調用,它試圖訪問任何與該QGraphicsTextItem指針,對發生的事情。
我相信它很明顯,但任何幫助將不勝感激。
您應該在構建QGraphicsTextItem時指定父項。這意味着它會在適當的時候被刪除。 – 2012-07-29 04:16:28
糾正我,如果我錯了或誤解的東西,但我認爲,當調用addItem時,場景獲取該項目的所有權。 – biokiwi 2012-07-29 05:34:46
是的,這是正確的。不過,我建議,當目標父代在構建時的範圍內時,使用QObject(父)構造函數(通過子類構造函數的代理)仍然是一個好習慣。 – 2012-07-29 06:54:43