我已经使用
鼠标移动事件在QGraphicsView上实现了平移视图void View::mouseMoveEvent(QMouseEvent* event) {
pan();
QGraphicsView::mouseMoveEvent(event);
}
在这个视图的场景中我添加了一些项目,其中一些项目可以调整大小,所以我实现了
void Item::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(m_resizeMode)
{
resize();
e->accept();
}
}
我尝试使用e-> accept()过滤鼠标移动不再传播 但是我首先调用了我的View mouseMove事件,所以当我尝试调整项目大小时,视图开始一直平移。
如何避免从视图到场景的此事件传播。
答案 0 :(得分:1)
视图将始终首先接收鼠标事件。
因此,在视图中,通过在场景坐标中获取鼠标位置并使用QGraphicsScene::items( )
检索该位置的项目,检查鼠标是否在项目上方以进行平移。答案 1 :(得分:1)
您可以调用QGraphicsView
的基类实现,并检查事件是否被接受。不过,我会在mousePressEvent
而不是mouseMoveEvent
中执行此操作。毕竟这是您确定是否应调整项目大小或进行一些平移的地方。这就是我在项目中做类似的事情:
void View::mousePressEvent(QMouseEvent *event)
{
...
QGraphicsView::mousePressEvent(event);
if(event->isAccepted())
move = false;
else
move = true;
}
void View::mouseMoveEvent(QMouseEvent *event)
{
if(!move)
{
QGraphicsView::mouseMoveEvent(event);
return;
}
... // you would do the panning here
QGraphicsView::mouseMoveEvent(event);
}
void View::mouseReleaseEvent(QMouseEvent *event)
{
if(!move)
{
QGraphicsView::mouseReleaseEvent(event);
return;
}
else
{
...
move = false;
}
QGraphicsView::mouseReleaseEvent(event);
}