2012-07-29 73 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

相關問題