如何从QGraphicsView中检索所选区域?

时间:2014-05-05 06:34:11

标签: c++ qt qgraphicsview

我需要我的QGraphicsView对用户选择做出反应 - 也就是说,当用户选择其中的区域时更改显示。我怎么能这样做?

据我所知,Qt Graphics框架中的选择通常通过选择项目来进行。我还没有找到任何触及选定区域的方法/属性,除了QGraphicsVliew::rubberBandSelectionMode,这没有帮助。

2 个答案:

答案 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矩形。