Reputation: 1929
I have the following code, where I'm trying to have two rectangles, and then inside each, display "sub" rectangles (this is the code for one parent and one 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)));
And I was excepting that when I display my QGraphicsView
, I would see a cyan rectangle (parent1
), on top of which I would also see a yellow smaller rectangle (subRect1
), but I'm only able to see the cyan one.
Looking at Qt's documentation, I see that they talk about the fact that QGraphicsItem
can have children, but why am I not seeing the child here?
PS: I tried adding the child in 3 different ways, but no luck:
setParentItem
on the child and passing the parent's pointerchildItems()
and then push_back
or append
and passing child's pointer to itUpvotes: 3
Views: 5352
Reputation: 2430
make_unique won't work here. When you add an object to the parent in Qt, you've passed off ownership. The trouble is that you also have an unique_ptr which owns it. As soon as it goes out of scope, it deletes youur object. Use new instead.
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)));
(This is not fully exception proof, but Qt isn't designed to use exceptions. You could make scene, for example, with make_unique and then hand it off to the graphicsView with release(), but in practice nobody ever does that with Qt.)
Upvotes: 5