堆栈对象不会被Qt识别,但堆对象会识别

时间:2010-11-10 06:42:52

标签: c++ oop qt

我很难理解在QT类实例化过程中遇到的问题,但我觉得它可能是一般的oop事情。问题是它只在我使用指向对象的指针后才起作用,但是不能仅仅使用对象变量本身。

main()中,我创建了一个小部件的实例:

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);

现在问题出在最后一行。测试图片(第2项)仅在我更改了最后一行后显示,因此它是一个指针:

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

为什么对象变量不起作用?这是由于某些内部QT问题还是我错过了什么?我还画了 boardScene 的背景,我看到了颜色,所以我知道它仍然“活着”。

1 个答案:

答案 0 :(得分:10)

因为在C ++中,堆栈变量在超出范围时会自动被破坏。在您的情况下,当boardView构造函数返回时,Board将被销毁,因此测试图片根本不会显示(因为boardView不再存在)。

另一方面,堆分配对象的生命周期未绑定到它们创建的范围,因此即使在构造函数返回后它仍然保持活动状态。这就是为什么测试图片只显示在你的第二个代码片段中。

请注意QGraphicsView(间接)继承自QWidget类,后者继承自QObject类。由于QObjects form object treesboardView也会在parent被摧毁时被正确销毁,所以一旦你完成它就不用担心会破坏它(当然,你仍然要担心破坏对象树的根。)