对QGraphicsView进行子类化并设置drawBackground

时间:2012-05-22 20:29:10

标签: qt qgraphicsitem qgraphicsscene

我正在尝试在Qt中创建一个与impoly(来自matlab)类似的函数。现在,我有一个QGraphicsView的子类,并将虚拟函数“drawBackground”设置为:

void roiwindow::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->drawImage(rect, *refimage);
painter->restore();
}

这很有效,基本上就是我想要的背景层。现在,我正在尝试添加最终将充当多边形节点的圆圈。我这样做是通过使用:

QGraphicsView *view = new QGraphicsView(this);
view->show();
QGraphicsEllipseItem *e1;
e1 = this->addEllipse(20, 20, 30, 30, QColor(0, 0, 0), Qt::white);
e1->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsMovable);

这就是我想要的。但是,有一个问题,当我点击并拖动椭圆时,椭圆的背景是* refimage的缩小版本...这会在屏幕上留下一些条纹,但当我点击另一个窗口时它会消失或最小化窗口。 QGraphicsItem是否也调用drawBackground?如果是这样,它似乎只在拖动项目时调用它。有关如何更好地编码的任何建议吗?感谢。

2 个答案:

答案 0 :(得分:4)

出现条纹是因为您可能将QGraphicsView设置为默认viewport update mode,即QGraphicsView::MinimalViewportUpdate。在这种情况下,您需要QGraphicsView::FullViewportUpdate。原因是当你移动项目时,它们背后的背景需要重新绘制,但是当你设置MinimalViewportUpdate时,只会重绘项目(除非有完整的视口更新,例如,从最小化/最大化窗口。)

答案 1 :(得分:2)

只要需要重新绘制图形视图的某些,就会调用

QGraphicsView::drawBackground某些可能比整个视图小,以获得更好的性能。

示例:当你有一个矩形项目时,假设在一个更大的场景/视图中有50 x 50像素,你将这个矩形向右移动20个像素,只有该项目前一个+新位置所覆盖的区域重绘(70 x 50像素)(因为这是更改的区域)。

drawBackground的重新实现中,您说:

painter->drawImage(rect, *refimage);

实际上以要更新的区域的大小绘制图像,而不是视图的总大小。

为了每次在相同位置和相同尺寸下绘制图像,您可以使用恒定位置(例如原点)并且不要更改图像的大小:

painter->drawImage(0, 0, *refimage);

或者你可以使用场景的整个区域:

painter->drawImage(sceneRect(), *refimage);

其中sceneRect()被定义为您的场景用于整个场景的相同矩形。当您添加不在rect中的新内容时,此rect会自动更新。您也可以通过手动将其设置为值来强制场景矩形,例如:

scene()->setSceneRect(0, 0, 800, 800);

请参阅文档:QGraphicsView::sceneRectQGraphicsScene::sceneRect