我没有尝试恢复子类QGraphicsScene上的子类化QGraphicsView中的特定视图(可见区域) .
应该看到的场景的可见矩形
mapToScene( rect() ).boundingRect()
是的
QRectF(27.8261,26.9565 673.043x507.826)
我在QGraphicsView的析构函数中获取这些值,它们看似有效 .
在恢复窗口几何体之后,我在第一个QGraphicsView :: resizeEvent(第一个事件的旧大小 QSize(-1, -1)
)中使用了所述值,试图恢复视图中显示的区域
fitInView( QRectF(....) , Qt::IgnoreAspectRatio);
这会在显示视图之前触发多个scrollContentsBy事件,之后会发生另一个调整大小和滚动事件,然后主窗口showEvent将触发,从而导致更多调整大小的滚动和调整大小事件 . 我确信这个序列是构建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()不会影响结果 .
1 回答
什么是最终工作:在showEvent中,恢复转换,恢复滚动条值:
滚动条可见性不会影响视图位置和大小,它们只是“叠加” .