Qt 子类化QGraphicsView和设置牵引地面

Qt 子类化QGraphicsView和设置牵引地面,qt,qgraphicsitem,qgraphicsscene,Qt,Qgraphicsitem,Qgraphicsscene,我试图在Qt中创建一个类似于impully(来自matlab)的函数。现在,我有一个QGraphicsView的子类,并将虚拟函数“DruckGround”设置为: 这是伟大的作品,基本上正是我想要的背景层。现在,我尝试添加最终将作为多边形节点的圆。我是通过以下方式做到这一点的: QGraphicsView *view = new QGraphicsView(this); view->show(); QGraphicsEllipseItem *e1; e1 = this->addEl

我试图在Qt中创建一个类似于impully(来自matlab)的函数。现在,我有一个QGraphicsView的子类,并将虚拟函数“DruckGround”设置为:

这是伟大的作品,基本上正是我想要的背景层。现在,我尝试添加最终将作为多边形节点的圆。我是通过以下方式做到这一点的:

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是否也称为退税地?如果是这样,它似乎只在拖动项目时调用它。有没有关于如何更好地编写代码的建议?谢谢。

QGraphicsView::trackground
在需要重新绘制图形视图时被调用。为了获得更好的性能,此视图可能比整个视图小

示例:如果在更大的场景/视图中有一个矩形项目,比如说50 x 50像素,并且将该矩形向右移动20个像素,则只有项目的上一个+新位置(70 x 50像素)覆盖的区域会被重新绘制(因为这是更改的区域)

在重新实施
退税地
时,您说:

painter->drawImage(rect, *refimage);
这实际上是以要更新的区域的大小绘制图像,而不是视图的总大小

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

painter->drawImage(0, 0, *refimage);
或者可以使用场景的整个区域:

painter->drawImage(sceneRect(), *refimage);
其中
scen直立()
定义为场景用于整个场景的同一个矩形。当您添加新内容时,此rect将自动更新,该内容将从rect中删除。也可以通过手动将场景矩形设置为值来强制场景矩形,例如:

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

请参阅文档:和

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

刚刚添加了一个printf语句,并且在拖动项目时调用了drauckGround函数…refimage
从何而来?这是可能的,但可能会很慢,因为在每次更新中,整个图像都会被缩放和绘制。@leems如果场景中有许多项目,它不一定会变慢。如果场景中的项目很少,那么速度差可能可以忽略不计,如果不是完全不可见的话。想象一个1k x 1k像素的场景中有很多项目。现在,他移动了一个大小为20 x 20像素乘以5像素的项目=>重绘1米像素,而缩放背景图像的100像素是10000倍,再加上其他项目的重绘。对于拖动的项目的平滑移动,这可能会有问题。但我认为这取决于具体情况…@leemes OP正试图从MATLAB中无效地重新创建,在MATLAB中不仅有节点,还有连接链接。根据我的经验,链接往往有大的边界矩形(因为它们通常是对角的),除非你弄乱了边界区域,这是昂贵的。因此,我认为场景不太可能只包含微小的项目。这解决了我的问题,并允许我保持缩放的背景图像。我会搞乱它,只是为了确保没有性能问题。谢谢你的回复,谢谢你的回复。我试过了,效果很好。唯一的问题是背景无法缩放到窗口大小。我希望窗口大小是可调整的,但如果这导致问题进一步发展,我可能会回到这个解决方案。感谢您的回复。您是否希望您的背景是静态的和独立于滚动的,即始终在相同的屏幕位置(和可见视图的大小)而不是场景位置(和场景的大小)绘制?如果是这样,这不是正确的解决方案。
scene()->setSceneRect(0, 0, 800, 800);