我试图做类似的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? 如果是这样它似乎只是把它叫做项目被拖动的时候。 对我怎么可以编写这更好有什么建议? 谢谢。
条纹正在发生,因为你可能的QGraphicsView设置为默认视口更新模式 ,这是QGraphicsView::MinimalViewportUpdate
。 在这种情况下,你需要QGraphicsView::FullViewportUpdate
。 其原因是,当你移动的物品,他们身后的背景需要重新绘制,但是当你有MinimalViewportUpdate
集中,只有项目将被重新绘制(除非有一个完整的视窗更新,例如,从最小化/最大化窗口) 。
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::sceneRect
和QGraphicsScene::sceneRect