我需要我的QGraphicsView对用户选择做出反应 - 也就是说,当用户选择其中的区域时更改显示。我怎么能这样做?
据我所知,Qt Graphics框架中的选择通常通过选择项目来进行。我还没有找到任何触及选定区域的方法/属性,除了QGraphicsVliew::rubberBandSelectionMode,这没有帮助。
答案 0 :(得分:1)
您可以使用qgraphicsscenemouseevent
。
在MousePress
上保存当前位置,在MouseRelease
上,您可以使用当前位置和MousePress
位置计算边界矩形。
这将为您提供所选区域。
如果您需要自定义形状,可以跟踪鼠标移动(MouseMove
)以获得形状。
可以找到使用qgraphicsscenemouseevent
的示例here。
答案 1 :(得分:1)
经过一些文档记录后,我找到了不同的解决方案。
在QGraphicsView
中有一个rubberbandChanged信号,其中只包含我想要使用的信息。所以,我在一个插槽中处理它,导致以下形式的处理程序:
void
MyImplementation::rubberBandChangedHandler(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)
{
// in default mode, ignore this
if(m_mode != MODE_RUBBERBANDZOOM)
return;
if(rubberBandRect.isNull())
{
// selection has ended
// zoom onto it!
auto sceneRect = mapToScene(m_prevRubberband).boundingRect();
float w = (float)width() / (float)sceneRect.width();
float h = (float)height() / (float)sceneRect.height();
setImageScale(qMin(w, h) * 100);
// ensure it is visible
ensureVisible(sceneRect, 0, 0);
positionText();
}
m_prevRubberband = rubberBandRect;
}
澄清一下:我的实施放大了选定的区域。为此,类包含名为QRect
的{{1}}。当用户使用rubberband选择停止选择时,参数m_prevRubberband
为空,并且可以使用保存的矩形值。
相关说明,为了处理鼠标事件而不干扰橡皮筋处理,rubberBandRect
可以用作标志(通过检查为空)。但是,如果处理了mouseReleaseEvent,则必须在调用默认事件处理程序之前执行检查,因为它会将m_prevRubberband
设置为null矩形。