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

pro*_*cer 3 c++ oop qt

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

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

Board board;
board.show();
Run Code Online (Sandbox Code Playgroud)

Board.h:

class Board : public QWidget
{

    Q_OBJECT

public:
    Board(QWidget* parent = 0);
    virtual ~Board();
};
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

QGraphicsView* boardView = new QGraphicsView (boardScene, this);
Run Code Online (Sandbox Code Playgroud)

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

In *_*ico 10

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

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

注意QGraphicsView(间接)继承自QWidget类,而类继承自QObject类.由于QObjects形成了对象树,boardView当它parent被破坏时也会被正确地破坏,所以一旦你完成它就不用担心它会被破坏(当然,你仍然要担心破坏它的根源)对象树).