如何在QGraphicsScene或QGraphicsView上显示/隐藏背景图?

时间:2015-06-02 14:57:55

标签: qt drawing qgraphicsscene

我想在QGraphicsScene上绘制某些内容,但不是QGraphicsItem(它会干扰QGraphicsItem集合的处理)。

示例:场景边界矩形,网格

为此目的,我正在覆盖drawBackground(QPainter *painter, const QRectF &rect)。 (我应该将场景子类化......)

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()));
}

我想选择显示/隐藏边界矩形或网格。

我唯一能想到的就是用背景画笔的颜色涂上它们?还有其他选择吗?

正如我上面所写,它有效 - 除了我需要对项目进行用户操作(或缩放或其他场景更改操作)以触发刷新或调用更新...(函数showHideBounds不 - 不确定如何强制刷新)

我会从drawBackground函数调用showHideBounds - 但我不知道如何获取painter

[另外,drawBackground似乎是自动绘制的......我怎么能给它所需要的rect参数? (看来如果我绘制rect它会绘制场景矩形,但我只看到右边和底边)]

1 个答案:

答案 0 :(得分:1)

为了重新绘制场景的特定部分,您可以调用

QGraphicsScene->invalidate(rect_to_redraw, Backgroundlayer)

请注意,如果drawBackground(*painter, rect)绘制在rect之外的区域,则不会自动更新。在这种情况下,必须使用适当的rect参数调用invalidate。