Qt qgraphicscene::changed()始终将单个大小的rect返回给应用程序窗口

Qt qgraphicscene::changed()始终将单个大小的rect返回给应用程序窗口,qt,qt4,qgraphicsview,Qt,Qt4,Qgraphicsview,在Qt 4.7.1 Windows应用程序中,连接到QGraphicscene::changed()的插槽按预期启动,但脏区计数始终为1,并且我得到的rect大小始终与我的应用程序窗口相同。我尝试调用QGraphicsView::setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);但那没用 有没有办法告诉Qt只给我更改过的页面区域?QGRaphicsView中的更新与QGraphicsCenter中的更新不同。视图中的更新是由于

在Qt 4.7.1 Windows应用程序中,连接到QGraphicscene::changed()的插槽按预期启动,但脏区计数始终为1,并且我得到的rect大小始终与我的应用程序窗口相同。我尝试调用QGraphicsView::setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);但那没用


有没有办法告诉Qt只给我更改过的页面区域?

QGRaphicsView中的更新与QGraphicsCenter中的更新不同。视图中的更新是由于需要重新绘制视图而导致的。无论是否改变场景。这通常是从窗口(调整大小)和视图更改(滚动)。场景中的更改也将触发对视图的更新

场景中的更改就是场景内容的更改。例如添加或删除项目、缩放或转换。这将发出
changed()
信号。显示该场景的所有视图也将更新自身以进行显示

比如说。滚动视图不会生成任何场景更新,因为场景中没有任何更改。将调用场景中项目的
paint()
函数来重新绘制。但不会从场景中发出
changed()
信号

例如,如果更改了场景的比例,则整个场景都会更改。除了整个重绘之外,场景还将发出
changed()
信号,指示整个场景已更改。但是,如果向场景中添加新项目,changed()应仅指示新项目的rect


如果您想知道场景的哪些部分需要重新绘制,除了调用
QGraphicsView::setViewportUpdateMode()
,还需要在视图中安装事件过滤器,并检查
QEvent::Paint
。请注意,QPaint事件中的区域和矩形位于视图的局部坐标中,这可能与场景不同。但是
QGraphicsView
有许多映射函数来进行转换。

感谢您的详细回复。我正要添加一些代码来捕获您建议的
QEvent::Paint
事件。我确实注意到当我滚动页面时触发了我的
changed()
事件,因此如果不应该发生这种情况,我可能已经错误地连接了所有内容。将继续挖掘。