我一直把这头发拉了几个小时。关于它有一个线程here,但似乎没有任何工作。 QGraphicsView :: rect()将返回宽度和高度,但left
和top
值未正确设置(始终为0 - 忽略滚动量)。我希望它在场景坐标中,但它应该很容易从任何系统翻译。我不知道horizontalScrollBar()->value()
和vert正在返回什么......似乎是毫无意义的胡言乱语。
@ fabrizioM:
// created here
void EditorWindow::createScene() {
m_scene = new EditorScene(this);
m_view = new EditorView(m_scene);
setCentralWidget(m_view);
connect(m_scene, SIGNAL(mousePosChanged(QPointF)), this, SLOT(mousePosChanged(QPointF)));
}
/// with this constructor
EditorView::EditorView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent) {
setRenderHint(QPainter::Antialiasing);
setCacheMode(QGraphicsView::CacheBackground);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setDragMode(QGraphicsView::NoDrag);
scale(1.0, -1.0); // flip coordinate system so that y increases upwards
fitInView(-5, -5, 10, 10, Qt::KeepAspectRatio);
setInteractive(true);
setBackgroundBrush(QBrush(QColor(232,232,232), Qt::DiagCrossPattern));
}
答案 0 :(得分:22)
使用视图将基于像素的视口矩形映射到场景:
graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect()
再见 烫发
答案 1 :(得分:6)
没关系。想出了这个,这似乎有效。
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));
}
答案 2 :(得分:3)
这是一个可能的解决方案(不知道这是否是预期的)
QRectF XXX::getCurrrentlyVisibleRegion() const
{
//to receive the currently visible area, map the widgets bounds to the scene
QPointF topLeft = mapToScene (0, 0);
QPointF bottomRight = mapToScene (this->width(), this->height());
return QRectF (topLeft, bottomRight);
}
HTH, 哈德
答案 3 :(得分:3)
以下实现为我返回了最佳结果:
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()
,它不会返回视图中正确可见的矩形,但无论如何都可能有用。
答案 4 :(得分:2)
您可以执行您已完成的操作,或使用mapToScene()函数。但是,您不能指望生成的场景“矩形”是一个矩形,因为场景可能会在视图中旋转或剪切,从而在映射到场景时产生一般多边形。
如果您的应用程序从未做过这样的事情,当然,您可以自由地假设矩形始终是合适的。
答案 5 :(得分:0)
听起来你想要的是场景矩形。 ::rect()
方法继承自QWidget
。参见: