如何从 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_prevRubberband
的QRect
。当用户用橡皮筋停止选择时,参数rubberBandRect
为空,可以使用保存的矩形值。
在相关说明中,要在不干扰橡皮筋处理的情况下处理鼠标事件,m_prevRubberband
可以用作标志(通过检查它是否为空)。但是,如果处理了 mouseReleaseEvent,则必须在调用默认事件处理程序之前进行检查,因为它会将m_prevRubberband
设置为空矩形。
【讨论】:
【参考方案2】:您可以使用qgraphicsscenemouseevent
。
在MousePress
上保存当前位置,在MouseRelease
上,您可以使用当前位置和MousePress
位置计算边界矩形。
这将为您提供所选区域。
如果您需要自定义形状,您可以跟踪鼠标移动 (MouseMove
) 来获取形状。
可以在here 找到一个使用qgraphicsscenemouseevent
的示例。
【讨论】:
以上是关于如何从 QGraphicsView 中检索选定区域?的主要内容,如果未能解决你的问题,请参考以下文章
在 QGraphicsView 中获取 QGraphicsScene 的可见区域 [重复]