子类的QGraphicsView和设置drawBackground(Subclassing QGra

2019-09-17 09:57发布

我试图做类似的Qt(从MATLAB)impoly的功能。 现在,我的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? 如果是这样它似乎只是把它叫做项目被拖动的时候。 对我怎么可以编写这更好有什么建议? 谢谢。

Answer 1:

条纹正在发生,因为你可能的QGraphicsView设置为默认视口更新模式 ,这是QGraphicsView::MinimalViewportUpdate 。 在这种情况下,你需要QGraphicsView::FullViewportUpdate 。 其原因是,当你移动的物品,他们身后的背景需要重新绘制,但是当你有MinimalViewportUpdate集中,只有项目将被重新绘制(除非有一个完整的视窗更新,例如,从最小化/最大化窗口) 。



Answer 2:

QGraphicsView::drawBackground被称为每当图形视图的东西需要重新绘制。 这东西可能比一个更好的性能,整个视图小。

例如:当你有一个长方形的项目,比方说,一个更大的场景/视图中的50×50个像素,而你由20个像素移动这个矩形的权利,只能由项先前+新位置覆盖的区域(70× 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



文章来源: Subclassing QGraphicsView and setting drawBackground