Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取QGraphicsView的可见矩形?_C++_Qt_Qgraphicsview - Fatal编程技术网

C++ 获取QGraphicsView的可见矩形?

C++ 获取QGraphicsView的可见矩形?,c++,qt,qgraphicsview,C++,Qt,Qgraphicsview,我已经用这个把头发拔了好几个小时了。有一个线索,但似乎没有任何工作。QGraphicsView::rect()将返回宽度和高度,但left和top值设置不正确(始终为0——忽略滚动的数量)。我希望它在场景坐标中,但它应该很容易从任何系统转换。我不知道水平滚动条()->value()和vert返回的是什么…似乎毫无意义 @: 别客气。我想出了这个,看起来很管用 QRectF EditorView::visibleRect() { QPointF tl(horizontalScrollBa

我已经用这个把头发拔了好几个小时了。有一个线索,但似乎没有任何工作。QGraphicsView::rect()将返回宽度和高度,但
left
top
值设置不正确(始终为0——忽略滚动的数量)。我希望它在场景坐标中,但它应该很容易从任何系统转换。我不知道
水平滚动条()->value()
和vert返回的是什么…似乎毫无意义


@:


别客气。我想出了这个,看起来很管用

QRectF EditorView::visibleRect() {
    QPointF tl(horizontalScrollBar()->value(), verticalScrollBar()->value());
    QPointF br = tl + viewport()->rect().bottomRight();
    QMatrix mat = matrix().inverted();
    return mat.mapRect(QRectF(tl,br));
}

听起来您想要的是场景矩形。
::rect()
方法继承自
QWidget
。见:


您可以执行已完成的操作,也可以使用mapToScene()函数。但是,您不能指望生成的场景“矩形”是矩形,因为场景可能会在视图中旋转或剪切,从而在映射到场景时生成一般多边形


当然,如果您的应用程序从未做过这样的事情,您可以自由地假设矩形总是合适的。

这里有一个可能的解决方案(不知道这是否是预期的解决方案)

嗯,,
Bernhard

只需使用视图将基于像素的视口矩形映射到场景:

graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect()
再见,
Marcel

以下实现为我返回了最佳结果:

QRectF getVisibleRect( QGraphicsView * view )
{
    QPointF A = view->mapToScene( QPoint(0, 0) ); 
    QPointF B = view->mapToScene( QPoint( 
        view->viewport()->width(), 
        view->viewport()->height() ));
    return QRectF( A, B );
}
当滚动条出现时,这仍然非常有效。仅当视图未显示旋转或剪切的场景时,此选项才能正常工作。如果旋转或剪切视图,则可见矩形在场景坐标系中不平行于轴。在这种情况下

view->mapToScene( view->viewport()->geometry() )

返回一个
QPolygonF
(不是
QRectF
),它是场景坐标中可见的矩形。顺便说一句,
QPolygonF
有一个成员函数
boundingRect()
,该函数不返回视图的正确可见矩形,但无论如何都可能有用。

请注意……滚动条值与。。。这不可能是场景,因为那些是浮标。。。但有点类似。也许你是如何构造QGraphicsView的,任何源代码片段?我不确定你到底想要什么代码。我如何构造它其实并不重要。。。获取visible rect应该完全相同。您阅读了描述吗?“场景矩形定义了场景的范围,在视图中,这意味着可以使用滚动条导航的场景区域。”ScenInstructure返回整个场景,而不仅仅是当前可见的区域(场景的一部分)。直接从文档中提取;“此属性保存此视图显示的场景区域。”。这就是你想要的,对吗?您还可以使用mapTo和mapFrom在坐标系之间进行转换。文档不清楚。“可视化”是什么意思?它是指您正在处理的场景区域,还是指正在绘制的场景?如果你有一个巨大的场景,你可以滚动,这个词的选择是模糊的。我也很困惑。看起来这是整个场景,而不仅仅是你现在可以在视图中看到的区域。如果你继续读下去,(当前)文档就很清楚了:“场景矩形定义了场景的范围,在视图中,这意味着你可以使用滚动条导航的场景区域。”但映射到场景的是什么?除了滚动条,我似乎无法从任何地方获得所需的信息。使用
graphicsView->rect()
而不是
graphicsView->viewport()->geometry()
@Sharpie()可能会更短,如果周围有边框(或可见滚动条),则视口()是相关的。在Qt 4.7.4中,这里的大多数答案都不起作用。视图坐标(0,0)似乎并不总是在可见区域的左上角。相反,视图坐标系本身由滚动条移动。然而马克的方法是有效的!(对我来说)
QRectF getVisibleRect( QGraphicsView * view )
{
    QPointF A = view->mapToScene( QPoint(0, 0) ); 
    QPointF B = view->mapToScene( QPoint( 
        view->viewport()->width(), 
        view->viewport()->height() ));
    return QRectF( A, B );
}
view->mapToScene( view->viewport()->geometry() )