在QGraphicsView中设置QGraphicsScene的精确视图区域(rect) -一个更好的fitInView

Setting exact view area (rect) of QGraphicsScene in QGraphicsView - a better fitInView()?

本文关键字:rect fitInView 更好 一个 区域 设置 QGraphicsView QGraphicsScene 视图      更新时间:2023-10-16

我未能在子类QGraphicsView上恢复一个特定的视图(可见区域)。

所查看场景的可见矩形应为

mapToScene( rect() ).boundingRect()

QRectF(27.8261,26.9565 673.043x507.826)

我在QGraphicsView的析构函数中获得了这些值,它们似乎是有效的。

恢复窗口几何形状后,我在第一个QGraphicsView::resizeEvent中使用上述值(第一个事件具有无效的旧大小QSize(-1, -1)),试图使用

恢复视图中显示的区域
fitInView( QRectF(....) , Qt::IgnoreAspectRatio);

这会在显示视图之前触发多个scrollContentsBy事件,之后触发另一个resize和scroll事件,然后主窗口showEvent触发,导致更多的resize scroll和resize事件。我确信这个序列是必要的GUI布局构建,但我现在很困惑,我如何能运行fitInView一旦一切都设置好。

在显示GUI后使用QTimer::singleShot运行该函数,我得到了大约所需的结果,但矩阵和查看的区域不同:

ui->graphicsView->matrix();
ui->graphicsView->mapToScene( ui->graphicsView->rect()).boundingRect();

:

"[m11=1 m12=0 m21=0 m22=1 dx=0 dy=0] (x=27 y=27 w=774 h=508)"

恢复:

"[m11=0.954724 m12=0 m21=0 m22=0.954724 dx=0 dy=0] (x=17.8062 y=24.0907 w=810.705 h=532.091)"

所以fitInView()不服务于我的目的很好-有另一个,可靠的方式吗?

我正在使用Qt 4.8.1与MSVC2010


另一种方法是恢复变换和窗口滚动位置,如下所示:

settings->setValue("view", mapToScene( rect() ).boundingRect() );
settings->setValue("transform", transform() );
settings->sync();

并恢复

QTransform trans = settings->value("transform", QTransform()).value<QTransform>();
QRectF view = settings->value( "view", QRectF() ).value<QRectF>();
setTransform( trans );
centerOn( view.center() );

但是这个方法也有一个偏移量

之前
"[m11=4.96282 m12=0 m21=0 m22=4.96282 dx=0 dy=0] (x=29.6203 y=29.4188 w=155.96 h=104.981)"

"[m11=4.96282 m12=0 m21=0 m22=4.96282 dx=0 dy=0] (x=54.8076 y=53.8001 w=155.96 h=104.981)" 

当滚动条被隐藏时,偏移量也会出现。将代码移动到showEvent()不会影响结果。

最后是什么工作:在showEvent中,恢复转换,恢复滚动条值:

setTransform( trans );
verticalScrollBar()->setValue( v );
horizontalScrollBar()->setValue( h );

滚动条的可见性不影响视图的位置和大小,它们只是"叠加"。