首页 文章

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

提问于
浏览
0

我没有尝试恢复子类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 回答

  • 0

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

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

    滚动条可见性不会影响视图位置和大小,它们只是“叠加” .

相关问题