如何将 children 添加到 QGraphicsItem

How to add children to QGraphicsItem

我有以下代码,其中我尝试有两个矩形,然后在每个矩形内显​​示 "sub" 个矩形(这是一个 parent 和一个 child)

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可以有children的事实,但为什么我在这里没有看到child?

PS:我尝试以 3 种不同的方式添加 child,但没有成功:

  1. 将 parent 传递给构造函数(如上所示)
  2. 在 child 上调用 setParentItem 并传递 parent 的指针
  3. 调用 parent 的 childItems(),然后调用 push_backappend 并将 child 的指针传递给它

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 这样做过。)