<P>跳入C++ QT源代码时,QQ:Q/P>>
<pre><code>QPointF QGraphicsView::mapToScene(const QPoint &point) const
{
Q_D(const QGraphicsView);
QPointF p = point;
p.rx() += d->horizontalScroll();
p.ry() += d->verticalScroll();
return d->identityMatrix ? p : d->matrix.inverted().map(p);
}
</code></pre>
<p>关键的是<code>p.rx() += d->horizontalScroll();</code>和垂直滚动。QGraphicsView始终包含滚动条,即使它们总是关闭或不显示。在显示小部件之前观察到的偏移量来自初始化时水平和垂直滚动条的值,当显示小部件和计算布局时,必须修改这些值以匹配视图/视口。为了使<code>mapToScene</code>正常工作,必须设置滚动条以匹配场景/视图。在</p>
<p>如果我把下面几行放在示例中对<code>mapToScene</code>的调用之前,那么我将得到适当的转换结果,而不必显示小部件。在</p>
^{pr2}$
<p>要更一般地执行此操作,可以从视图中提取一些相关的转换。在</p>
<pre><code># Use the size hint to get shape info
wid, hgt = (pick.view.sizeHint().width()-2,
pick.view.sizeHint().height()-2) # -2 removes padding ... maybe?
# Get the opposing corners through the view transformation
px = pick.view.transform().map(QPoint(wid, 0))
py = pick.view.transform().map(QPoint(0, hgt))
# Set the scroll bars accordingly
pick.view.horizontalScrollBar().setRange(px.y(), px.x())
pick.view.verticalScrollBar().setRange(py.y(), py.x())
pick.view.horizontalScrollBar().setValue(px.y())
pick.view.verticalScrollBar().setValue(py.y())
</code></pre>
<p>这是一个既老套又难看的解决方案,因此,虽然它确实有效,但可能有一种更优雅的方法来处理这个问题。在</p>