我正在尝试在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?如果是这样,它似乎只在拖动项目时调用它。有关如何更好地编码的任何建议吗?感谢。
答案 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);