在Qt中被doubleclickevent和mousepressevent混淆

时间:2014-10-21 13:46:28

标签: c++ qt qgraphicsview qgraphicsitem

情况是:

QGraphicsView旁边,我使用其doubleClickEvent函数创建了QGraphicsItem。 我重写了QGraphicsItem mousePressEvent函数,只需打印qDebug信息。

但是,我发现:即使我只是双击创建QGraphicsItem,也会调用新创建的QGraphicsItem mousePressEvent

这会怎么样?我该怎么做才能防止这种情况发生?

1 个答案:

答案 0 :(得分:4)

QGraphicsView是一个小部件,因此它有一个doubleClickEvent。相比之下,QGraphicsItem不是一个小部件,但有一个mousePressEvent。

当您覆盖事件时,如果您不希望它们传播到其他对象,则需要accept该事件告诉系统您已经处理过它。

void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent * event)
{
   // Create a graphics item..
   ...
   event->accept(); // tell the system that the event has been handled
}

不接受该事件,双击将传递给QGraphicsScene,然后传递给QGraphicsItem。

如果您希望能够在单击场景的空白区域时双击以创建项目,但是如果双击某个项目,则会有项目作出反应,您可以覆盖该场景' s在决定是否创建项目或传递事件之前,mouseDoubleClickEvent代替视图并检查光标位置是否有项目。

void QGraphicsScene::mouseDoubleClickEvent( QGraphicsSceneMouseEvent * mouseEvent )
{
    if(items(mouseEvent->scenePos()).isEmpty()) // if no items are at this position
    {
         // create new graphics item
         ...
         mouseEvent->accept(); // don't propagate the event
    }

    // no items, so allow the event to propagate by doing nothing
}