Unable to contain children bounding boxes in parent bounding box programatically. Screenshots...



  • https://postimg.org/image/ixb304fi9/

    Here's the code. As you can see in the screen shots, bottom and right adjust in size properly, but placing a node in the top-left area such that the node extents outside the parent, no size adjustment is made, the box and that size seems to stay the same. I've tried 100 different code variants and spent 2 days on the problem.

    class RoundedRectNodeGfx(NodeGfx, QGraphicsRectItem):
        def __init__(self, obj, parent=None):
            QGraphicsRectItem.__init__(self, parent)
            NodeGfx.__init__(self, obj)
            self.setRect(QRectF(0,0,100,100))
            # TODO DEBUG REMOVE:
            self.setBrush(QBrush(QColor(255, 255, 0, 255)))
            self.setPen(QPen(QColor(0, 255, 255, 255), 2.5))
            
        def paint(self, painter, item, widget):
            GfxObject.paint(self, painter, item, widget)
            painter.setPen(self.pen())
            painter.setBrush(self.brush())
            painter.drawRect(self.rect())
            # DBG
            self._dbgPaint(painter, item, widget)
            
        def resize(self, children=None):
            if children == None:
                children = self.childItems()
            rects = [child.mapToItem(self, QPolygonF(child.rect())).boundingRect() for child in children]
            rects.append(self.boundingRect())
            rect = minBoundingRect(rects)
            #self.setPos_(self.sceneTransform().map(rect.topLeft()))
            #rect = self.mapFromScene(rect).boundingRect()
            pos = self.sceneTransform().map(rect.topLeft())
            self.setPos_(pos)
            self.setRect(QRectF(0,0, rect.width(), rect.height()))        
            parent = self.parentItem()
            if parent and isinstance(parent, NodeGfx):
                parent.resize(children=[self])
    
        #def selectionPath(self):
            #pass
        
        #def sceneBoundingPolygon(self):
            #return self.sceneTransform().map(QPolygonF(self.boundingRect()))
    


  • This variant does not work either:

        def resize(self, children=None):
            if children == None:
                children = self.childItems()        
            sceneRect = self.sceneBoundingRect()
            childItems = self.scene().createItemGroup(children)
            childSceneRect = childItems.sceneBoundingRect()
            self._dbgPolys['child scene rect'] = lambda: QPolygonF(childSceneRect)
            rect = minBoundingRect([childSceneRect, sceneRect])
            self.setPos_(rect.topLeft())
            #rect = self.sceneTransform().inverted()[0].map(QPolygonF(rect)).boundingRect()
            self.setRect(QRectF(0,0, rect.width(), rect.height()))
            parent = self.parentItem()
            if parent and isinstance(parent, NodeGfx):
                parent.resize(children=[self])
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.