Qt:在调用drawForeground()之前,QGraphicsView内容未被删除

时间:2014-02-14 14:56:35

标签: c++ qt scroll repaint qgraphicsview

我使用Qt QGraphicsView框架面临一个烦人的问题。 我写了一个基本的图像查看器来显示大的B& W tiff图像。 图像使用QGraphicsPixmapItem显示并添加到场景中。

我还需要在视口周围绘制一个彩色矩形。

void ImageView::drawForeground( QPainter * painter, const QRectF & rect )
{
    if( m_image ) {
        qDebug() << "drawForeground(), rect = " << rect;
        QBrush br(m_image->isValidated() ? Qt::green : Qt::red);

        qreal w = 40. / m_scaleFactor;

        QPen pen(br, w);
        painter->save();
        painter->setOpacity(0.5);
        painter->setPen(pen);
        painter->drawRect(rect);
        painter->restore();
    }
}

乍一看它运作正常。

但是当我滚动视口内容时,事情变得越来越难看。 drawForeground()方法被有效地调用,但看起来视口的内容之前没有被删除。所以画面在屏幕上变得很糟糕。

有没有更好的方法来实现它?

修改

正如leems所提到的,Qt内部并没有让我用drawForeground()来实现它。 我通过使用 QGraphicsRectItem 找到了一种解决方法,它在viewportEvent()中调整了大小。 Loos喜欢:

bool ImageView::viewportEvent(QEvent *ev)
{
    QRect rect = viewport()->rect();

    if( m_image ) {
        QPolygonF r = mapToScene(rect);
        QBrush br2(m_image->isValidated() ? Qt::green : Qt::red);
        qreal w2 = 40. / m_scaleFactor;
        QPen pen2(br2, w2);
        m_rect->setPen(pen2);
        m_rect->setOpacity(0.5);
        m_rect->setRect(r.boundingRect());
    }

    return QGraphicsView::viewportEvent(ev);
}

代码尚未最终确定,但基本上就是这样。 它运行正常,但滚动太快时会闪烁一点......

0 个答案:

没有答案