2010-11-10 52 views
3

我很難理解我在QT類的實例化過程中遇到的問題,但我感覺它可能是普通的OOP事物。問題在於它只在我使用了一個指向該對象的指針後才起作用,但不能僅用對象變量本身。堆棧對象沒有被Qt識別,但堆對象確實是

主()我創建窗口小部件的一個實例:

Board board; 
board.show(); 

Board.h

class Board : public QWidget 
{ 

    Q_OBJECT 

public: 
    Board(QWidget* parent = 0); 
    virtual ~Board(); 
}; 

Board.cpp

Board::Board(QWidget* parent) : 
    QWidget(parent) 
{ 

    QGraphicsScene* boardScene = new QGraphicsScene(this); 
    boardScene->setSceneRect(this->rect()); 

    QGraphicsItem* item2 = new QGraphicsPixmapItem(QPixmap("test.jpg")); 
    item2->setPos(100,100); 
    boardScene->addItem(item2); 


    QGraphicsView boardView (boardScene, this); 

現在問題出現在最後一行。測試圖片(ITEM2)只顯示後,我改變了最後一行,以便它是一個指針:

QGraphicsView* boardView = new QGraphicsView (boardScene, this); 

爲什麼沒有對象變量的工作?這是由於一些內部的QT事情還是我錯過了什麼?我也畫了boardScene的背景,我看到了顏色,所以我知道它仍然「活着」。

回答

10

因爲在C++中,堆棧變量在超出作用域時會自動被破壞。在你的情況下,當Board構造函數返回時,boardView將被破壞,所以測試圖片根本不顯示(因爲boardView不再存在)。

另一方面,堆分配對象的生存期並未綁定到創建它們的範圍,所以即使在構造函數返回後它仍保持活動狀態。這就是爲什麼只有你的第二個代碼片段才顯示測試圖片的原因。

請注意,QGraphicsView(間接)繼承自QWidget類,該類繼而從QObject類繼承。由於QObjects form object trees,boardView也會在parent被破壞時被正確銷燬,所以一旦完成它就不用擔心毀壞它(當然,你仍然需要擔心銷燬對象的根目錄樹)。

+0

D'oh!我傾向於忘記構造函數是「唯一」函數,並且不存在整個對象的整個生命週期。謝謝 – problemofficer 2010-11-10 06:58:13