Объект стека не распознается Qt, но объект кучи - PullRequest
3 голосов
/ 10 ноября 2010

Мне трудно понять проблему, с которой я столкнулся во время создания класса QT, но у меня есть ощущение, что это может быть общая проблема.Проблема заключалась в том, что он работал только после того, как я использовал указатель на объект, но не работал только с самой переменной объекта.

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

Теперь проблемабыл в последней строке.Тестовая картинка (item2) была показана только после того, как я изменил последнюю строку, чтобы она была указателем:

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

Почему переменная объекта не работает?Это из-за какой-то внутренней QT или я что-то упустил?Я также нарисовал фон boardScene и увидел цвет, так что я знаю, что он все еще "жив".

1 Ответ

10 голосов
/ 10 ноября 2010

Поскольку в C ++ переменные стека автоматически уничтожаются, когда они выходят из области видимости. В вашем случае boardView будет уничтожено, когда вернется конструктор Board, поэтому тестовое изображение не будет отображаться вообще (поскольку boardView больше не существует).

С другой стороны, время жизни объектов, выделенных кучей, не связано с областью, в которой они были созданы, поэтому оно остается живым даже после возврата конструктора. Вот почему тестовая картинка была показана только с вашим вторым фрагментом кода.

Обратите внимание, что QGraphicsView (косвенно) наследуется от класса QWidget, который, в свою очередь, наследуется от класса QObject. Так как QObject s формируют деревья объектов , boardView будет должным образом разрушен, когда parent также уничтожен, так что вам не нужно беспокоиться об его уничтожении, когда вы закончите с ним (конечно, вам все равно придется беспокоиться об уничтожении корня дерева объектов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...