在Qt 4.7.1 Windows应用程序中,连接到QGraphicsScene :: changed()的插槽按预期触发,但脏区域计数始终为1,我获得的rect大小始终与我的应用程序窗口相同。我试过调用QGraphicsView :: setViewportUpdateMode(QGraphicsView :: MinimalViewportUpdate);但这没有帮助。
有没有办法告诉Qt只给我改变页面的区域?
答案 0 :(得分:2)
QGRaphicsView
中的更新与QGraphicsScene
中的更新不同。视图中的更新是由需要重新绘制视图引起的。有无改变场景。这通常来自窗口(调整大小)和视图更改(滚动)。场景中的更改也会触发对视图的更新。
场景中的更改是场景内容的更改。像添加或删除项目,缩放或翻译转换一样。这将发出changed()
信号。显示该场景的所有视图也将自行更新以显示。
例如。滚动视图不会生成任何场景更新,因为场景中没有任何更改。将调用场景中项目的paint()
功能进行重绘。但是不会从场景中发出changed()
信号。
例如,如果您更改了场景的比例,则整个场景都会发生变化。除了整个重绘之外,场景将发出changed()
信号并指示整个场景发生了变化。但是如果向场景添加新项目,则changed()应仅指示新项目的矩形。
如果您想知道需要重新绘制场景的哪个部分,除了调用QGraphicsView::setViewportUpdateMode()
之外,还需要在视图中安装事件过滤器并检查QEvent::Paint
。请注意,QPaintEvent中的region和rect位于视图的局部坐标中,可以与场景不同。但是QGraphicsView
有许多映射函数可以进行转换。