[Interest] How to change parent of scaled QGraphicsItem while retaining scene bounding rect?
Patrick Stinson
patrickkidd at gmail.com
Wed Aug 8 19:42:40 CEST 2018
Thanks for that. Though I am having some trouble. If you have PyQt, I wonder what problem you see with this example:
def tests_QGI_parent_transform():
app = QApplication(sys.argv)
view = QGraphicsView()
scene = QGraphicsScene()
rect = QRectF(-50.0, -50.0, 100.0, 100.0)
parentA = QGraphicsRectItem(rect) # red
parentA.setPos(-100, -100)
parentA.setScale(.5)
parentA.setPen(Qt.red)
scene.addItem(parentA)
parentB = QGraphicsRectItem(rect) # blue
parentB.setPos(100, 100)
parentB.setScale(1.0)
parentB.setPen(Qt.blue)
scene.addItem(parentB)
child = QGraphicsRectItem(rect) # green
child.setPos(-100, 100)
child.setPen(Qt.green)
scene.addItem(child)
view.setScene(scene)
buttonParent = QWidget(view)
parentAButton = QPushButton('Set Parent A', buttonParent)
parentBButton = QPushButton('Set Parent B', buttonParent)
noParentButton = QPushButton('Set No Parent', buttonParent)
ButtonLayout = QVBoxLayout(buttonParent)
ButtonLayout.addWidget(parentAButton)
ButtonLayout.addWidget(parentBButton)
ButtonLayout.addWidget(noParentButton)
buttonParent.move(10, 10)
def setParent(parent):
if parent == child.parentItem():
return
sceneTransform = child.sceneTransform() # I assume even if the child has a parent.
if parent:
inverted, ok = parent.sceneTransform().inverted()
localTransform = inverted * sceneTransform
print(parent.pen().color().name())
else:
localTransform = sceneTransform
child.setTransform(localTransform)
child.setScale(1.0)
child.setRotation(0.0)
child.setParentItem(parent)
parentAButton.clicked.connect(lambda: setParent(parentA))
parentBButton.clicked.connect(lambda: setParent(parentB))
noParentButton.clicked.connect(lambda: setParent(None))
view.resize(800, 600)
r = scene.itemsBoundingRect()
sceneRect = r.marginsAdded(QMarginsF(r.x() * 2,
r.y() * 2,
r.width() * 2,
r.height() * 2))
view.fitInView(sceneRect)
view.centerOn(0, 0)
view.show()
app.exec()
tests_QGI_parent_transform()
> On Aug 7, 2018, at 10:05 PM, Christian Gagneraud <chgans at gmail.com> wrote:
>
> On 8 August 2018 at 15:49, Patrick Stinson <patrickkidd at gmail.com> wrote:
>> Thanks for the reply. I am just particularly dense in this sort of cognitive operation (something about flipping symbolic representations like in fractional arithmetic) and might do well with just a bit of code or pseudo code. Do you think you might provide some?
>
> I haven't done graphics stuff in a while (unfortunately), but this
> should be as simple as:
> scene_xform = item->sceneTransform();
> local_xform = next_parent->sceneTransform().inverted() * scene_xform;
> item.setTransform(local_xform);
> item.setScale(1.0);
> item.setRotation(0.0);
> item.setParentItem(next_parent);
>
> AFAIR, QGI's rotation and scale need to be reset b/c they are combined
> with QGI's transform()
>
> Hope this help!
> Chris
>
>>
>> Thanks!
>>
>>> On Aug 7, 2018, at 6:24 PM, Christian Gagneraud <chgans at gmail.com> wrote:
>>>
>>> On 8 August 2018 at 11:08, Patrick Stinson <patrickkidd at gmail.com> wrote:
>>>> Hello!
>>>>
>>>> I am trying to change the parent of a QGraphicsItem without it appearing to move or change size on the scene. Both the item, old parent, and new have arbitrary scale values set. How can this be done?
>>>
>>> If you grab the item's sceneTransform() before re-parenting, you
>>> should be able to deduce it's new local transform from it's new parent
>>> sceneTransform().
>>>
>>>
>>>>
>>>> Thanks!
>>>> _______________________________________________
>>>> Interest mailing list
>>>> Interest at qt-project.org
>>>> http://lists.qt-project.org/mailman/listinfo/interest
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20180808/1169a652/attachment.html>
More information about the Interest
mailing list