Thalia
Thalia

Reputation: 14615

How can I show/hide background drawing on QGraphicsScene or QGraphicsView?

I would like to have certain things drawn on QGraphicsScene, but not be QGraphicsItem (it would interfere with the processing of the QGraphicsItem collection).

Example: a scene bounding rectangle, a grid

I am overriding the drawBackground(QPainter *painter, const QRectF &rect) for that purpose. (I should subclass the scene... )

void MyView::showHideBounds()
{
    m_showBackgroundBounds = !m_showBackgroundBounds;
    // can't triger an update ???
    update(); // neither does anything
    viewport()->update();
}

void MyView::drawBackground(QPainter *painter, const QRectF &rect)
{
    QPen pen;
    if(m_showBackgroundBounds)
        pen = QPen(QColor(0, 0, 0), 10, Qt::PenStyle(Qt::SolidLine));
    else
        pen = QPen(QColor(255, 255, 255), 10, Qt::PenStyle(Qt::SolidLine));

    painter->setPen(pen);
    painter->drawRect(QRect(QPoint(-scene()->sceneRect().size().toSize().width()/2,
                                   -scene()->sceneRect().size().toSize().height()/2),
                            scene()->sceneRect().size().toSize()));
}

I would like the option to show/hide either the bounding rectangle or the grid.

The only thing I can think of is paint over them with the color of the background brush ? Is there any other option ?

As I have written it above, it works - except I need user action on items (or a zoom or some other scene changing action) to trigger refresh, or call an update... (the function showHideBounds doesn't - not sure how to make it force a refresh)

I would call the drawBackground from the showHideBounds function - but I don't know how to get the painter

[Also, the drawBackground seems to be drawn automatically... how can I give it the rect argument it needs ? (it seems if I draw the rect it does draw the scene rectangle but I only see the right and bottom edges)]

Upvotes: 2

Views: 1873

Answers (1)

Pramod Kumar
Pramod Kumar

Reputation: 96

In order to redraw a particular section of scene, you can call

QGraphicsScene->invalidate(rect_to_redraw, Backgroundlayer)

Note that if drawBackground(*painter, rect) paints over area outside rect, it will not update automatically. In that case invalidate has to be called with appropriate rect parameters.

Upvotes: 1

Related Questions