4

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

4

2 回答 2

4

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

于 2012-05-22T20:44:40.017 回答
2

QGraphicsView::drawBackground每当需要重新绘制图形视图的某些内容时调用。可能比整体视图更小以获得更好的性能。

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

在您的重新实现中drawBackground,您说:

painter->drawImage(rect, *refimage);

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

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

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

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

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

wheresceneRect()被定义为您的场景用于整个场景的相同矩形。当您添加超出矩形的新内容时,该矩形会自动更新。您还可以通过手动将其设置为一个值来强制使用场景矩形,例如:

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

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

于 2012-05-22T20:42:08.797 回答