[Interest] [solved] Re: QGV: Problem with ItemClipsChildrenToShape flag

Christian Gagneraud chgans at gna.org
Fri May 8 06:40:41 CEST 2015


On 08/05/15 13:44, Christian Gagneraud wrote:
> Hi there,
>
> I am currently implementing a TextFrame QGI, that will typically look
> like a sticky note.
> I want the user to be able to control the size of the frame, so I
> decided to implement my frame class as a direct subclass of QGI and use
> composition to manage the text through a QGraphicsTextItem.
> I'm doing pretty well except for one thing: since the height of the QGTI
> cannot be controlled I set the ItemClipsChildrenToShape flag on my frame
> class (the parent item), thinking it will hide any text of the QGTI (the
> child item) that doesn't overlap the shape of my frame.
>
> According to the documentation this is exactly what the flag is intended
> for, but nfortunaately it doesn't work in my case, whatever the shape of
> my parent item, the text always renders from the top to the bottom.

So I made a couple of checks and this is what I saw from within the
frame's paint function:
- both items have a non empty bounding rect and shape
- both items' isClipped() return false
- both items' clipPath() return an empty path
- both items have only the ItemIsSelectable flag set

Which lead me to look for whom was trying to set some flags and bam!
I spotted a setFlags(flag) where it should have been setFlag(flag).

That's one small 's' for a source file and one giant bug for an app!

Krys

>
> This is what my constructor looks like:
> GraphicsTextFrameItem::GraphicsTextFrameItem(SchItem *parent):
> SchItem(parent),
> m_textItem(new QGraphicsTextItem(this))
> {
> m_textItem->setPos(0, 0);
> connect(m_textItem, &QGraphicsTextItem::linkActivated,
> this, &GraphicsTextFrameItem::linkActivated);
> connect(m_textItem, &QGraphicsTextItem::linkHovered,
> this, &GraphicsTextFrameItem::linkHovered);
>
> setFlag(QGraphicsItem::ItemClipsChildrenToShape);
> }
>
> And here is how I manage resizing:
> void GraphicsTextFrameItem::itemNotification(IGraphicsObservableItem *item)
> {
> AbstractGraphicsHandle *handle =
> dynamic_cast<AbstractGraphicsHandle*>(item);
> Q_ASSERT(handle && handle->handleId() == 0);
>
> prepareGeometryChange();
> m_frameRect.setBottomRight(handle->pos());
> m_textItem->setTextWidth(m_frameRect.width());
> m_boundingRect = QRectF();
> update();
> }
>
> The graphics handle is a small item class that sends notification when
> it is moved around, typically used a control point and size handler.
>
> It looks like I'm missing something, or maybe I just misunderstood the
> documentation. Any help or point out appreciated.
>
> Thanks,
> Chris
>
>




More information about the Interest mailing list