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