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

Posted

技术标签:

【中文标题】如何从 QGraphicsView 中检索选定区域?【英文标题】:How does one retrieve selected area from QGraphicsView? 【发布时间】:2014-05-05 06:34:10 【问题描述】:

我需要我的 QGraphicsView 对用户选择做出反应 - 即,当用户选择其中的区域时更改显示。我该怎么做?

据我所知,Qt Graphics 框架中的选择通常是通过选择项目来实现的。除了QGraphicsVliew::rubberBandSelectionMode,我还没有找到任何触及所选区域的方法/属性,这无济于事。

【问题讨论】:

【参考方案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;

澄清一下:我的实现放大了选定区域。为此,类包含称为m_prevRubberbandQRect。当用户用橡皮筋停止选择时,参数rubberBandRect为空,可以使用保存的矩形值。

在相关说明中,要在不干扰橡皮筋处理的情况下处理鼠标事件,m_prevRubberband 可以用作标志(通过检查它是否为空)。但是,如果处理了 mouseReleaseEvent,则必须在调用默认事件处理程序之前进行检查,因为它会将m_prevRubberband 设置为空矩形。

【讨论】:

【参考方案2】:

您可以使用qgraphicsscenemouseevent

MousePress 上保存当前位置,在MouseRelease 上,您可以使用当前位置和MousePress 位置计算边界矩形。

这将为您提供所选区域。 如果您需要自定义形状,您可以跟踪鼠标移动 (MouseMove) 来获取形状。

可以在here 找到一个使用qgraphicsscenemouseevent 的示例。

【讨论】:

以上是关于如何从 QGraphicsView 中检索选定区域?的主要内容,如果未能解决你的问题,请参考以下文章

如何从选定的单元格区域创建唯一列表?

在 QGraphicsView 中获取 QGraphicsScene 的可见区域 [重复]

如何从 DataTables 中的选定数据中获取数据

从.net(C#)中的Webbrowser控件中检索选定的文本

如何识别 QGraphicsView 鼠标移动事件?

如何在QGraphicsview中超越滚动条范围?