我使用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);
}
代码尚未最终确定,但基本上就是这样。 它运行正常,但滚动太快时会闪烁一点......