graphicsview 在 item 之前接收到鼠标事件
graphicsview receives mouse event before the item
我已经在 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 事件首先被调用,所以每当我尝试调整项目大小时,视图开始一路平移。
如何避免此事件从视图传播到场景。
视图总是先接收到鼠标事件。
因此,在视图中,通过获取场景坐标中的鼠标位置并使用 QGraphicsScene::items( )[=11 检索该位置的项目,在允许项目平移之前检查鼠标是否在项目上方=]
您可以调用 QGraphicsView
的基础 class 实现并检查事件是否被接受。但是,我会在 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);
}
我已经在 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 事件首先被调用,所以每当我尝试调整项目大小时,视图开始一路平移。
如何避免此事件从视图传播到场景。
视图总是先接收到鼠标事件。
因此,在视图中,通过获取场景坐标中的鼠标位置并使用 QGraphicsScene::items( )[=11 检索该位置的项目,在允许项目平移之前检查鼠标是否在项目上方=]
您可以调用 QGraphicsView
的基础 class 实现并检查事件是否被接受。但是,我会在 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);
}