我很难理解在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 的背景,我看到了颜色,所以我知道它仍然“活着”。
答案 0 :(得分:10)
因为在C ++中,堆栈变量在超出范围时会自动被破坏。在您的情况下,当boardView
构造函数返回时,Board
将被销毁,因此测试图片根本不会显示(因为boardView
不再存在)。
另一方面,堆分配对象的生命周期未绑定到它们创建的范围,因此即使在构造函数返回后它仍然保持活动状态。这就是为什么测试图片只显示在你的第二个代码片段中。
请注意QGraphicsView
(间接)继承自QWidget
类,后者继承自QObject
类。由于QObject
s form object trees,boardView
也会在parent
被摧毁时被正确销毁,所以一旦你完成它就不用担心会破坏它(当然,你仍然要担心破坏对象树的根。)