如何将孩子添加到QGraphicsItem

时间:2016-03-16 04:05:00

标签: c++ qt qgraphicsitem

我有以下代码,我试图有两个矩形,然后在每个内部,显示" sub"矩形(这是一个父母和一个孩子的代码)

auto graphicsView = std::make_unique<QGraphicsView>();
auto scene = std::make_unique<QGraphicsScene>();
graphicsView->setScene(scene.get());

auto parent1 = std::make_unique<QGraphicsRectItem>(0, 0, 100, 200);
parent1->setBrush(QBrush(QColor(Qt::cyan)));

scene->addItem(parent);

auto subRect1 = std::make_unique<QGraphicsRectItem>(10, 10, 50, 50, parent1);
subRect1->setBrush(QBrush(QColor(Qt::yellow)));

我除了显示我的QGraphicsView时,我会看到一个青色矩形(parent1),在其上面我还会看到一个黄色的小矩形(subRect1 ),但我只能看到青色的一个。

看看Qt的文档,我看到他们谈到QGraphicsItem可以生孩子的事实,但为什么我没有在这里看到孩子呢?

PS:我尝试以3种不同的方式添加孩子,但没有运气:

  1. 将父级传递给构造函数(如上所示)
  2. 在孩子身上调用setParentItem并传递父母的指针
  3. 致电家长的childItems(),然后push_backappend,并将孩子的指针传递给

1 个答案:

答案 0 :(得分:3)

make_unique不会在这里工作。当你在Qt中向父母添加一个对象时,你已经失去了所有权。麻烦的是你拥有一个拥有它的unique_ptr。一旦超出范围,它就会删除你的对象。请改用新的。

auto graphicsView = new QGraphicsView();
auto scene = new QGraphicsScene();
graphicsView->setScene(scene);

auto parent1 = new QGraphicsRectItem(0, 0, 100, 200);
parent1->setBrush(QBrush(QColor(Qt::cyan)));

scene->addItem(parent);

auto subRect1 = new QGraphicsRectItem(10, 10, 50, 50, parent1);
subRect1->setBrush(QBrush(QColor(Qt::yellow)));

(这不是完全异常证明,但是Qt并不是为了使用异常而设计的。例如,您可以使用make_unique制作场景,然后使用release()将其移交给graphicsView,但实际上没有人用Qt做过。)