2012-07-29 72 views
0

我对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指针,对发生的事情。

我相信它很明显,但任何帮助将不胜感激。

+0

您应该在构建QGraphicsTextItem时指定父项。这意味着它会在适当的时候被删除。 – 2012-07-29 04:16:28

+0

纠正我,如果我错了或误解的东西,但我认为,当调用addItem时,场景获取该项目的所有权。 – biokiwi 2012-07-29 05:34:46

+0

是的,这是正确的。不过,我建议,当目标父代在构建时的范围内时,使用QObject(父)构造函数(通过子类构造函数的代理)仍然是一个好习惯。 – 2012-07-29 06:54:43

回答

1

OK,我什么都不知道,你正在使用的库,但我怀疑的错误是在这里

GameScene::GameScene(QObject *parent) : 
    QGraphicsScene(parent) 
{ 
    QGraphicsTextItem* p = new QGraphicsTextItem(QString("HEEEEE")); 
    p->setFlags(p->ItemIsMovable); 
    p->moveBy(qreal(500),qreal(500)); 
    addItem(p); 
} 

应该

GameScene::GameScene(QObject *parent) : 
    QGraphicsScene(parent) 
{ 
    p = new QGraphicsTextItem(QString("HEEEEE")); 
    p->setFlags(p->ItemIsMovable); 
    p->moveBy(qreal(500),qreal(500)); 
    addItem(p); 
} 

keyPressEvent方法尝试使用所谓的P A的成员变量,它看起来像你正在试图在构造函数中设置它,但你不是。你所有的构造函数都是局部变量,也称为p。

+0

非常感谢,正是这是错误的。 – biokiwi 2012-07-29 05:33:04

+0

通过使用前缀总是将类变量命名为与常规变量不同的名称是一个很好的约定。比如有人说'class X {int myVariable; };',有人说'class X {int m_Variable; };',我个人喜欢这样做'class X {int _variable; };'尽管人们告诉我这一点。无论如何,为了避免混淆,在类变量的名称和正常变量之间有一个明确的区分是个好主意。 – jahhaj 2012-07-29 05:44:42

+0

@jahhaj:以下划线开头的标识符保留给系统(编译器和标准库)。您很难通过使用它们来调试命名冲突。 – 2012-07-29 06:52:46

相关问题