在Qt中被doubleclickevent和mousepressevent混淆

Nya*_*uko 4 c++ qt qgraphicsview qgraphicsitem

情况是:

在A面QGraphicsView,我用它的doubleClickEvent功能来制作一个QGraphicsItem。我重写QGraphicsItemmousePressEvent功能以仅打印qDebug信息。

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

这将如何发生?我该怎么做才能避免这种情况?

The*_*ght 5

QGraphicsView是一个小部件,因此具有doubleClickEvent。相反,QGraphicsItem不是小部件,但是具有mousePressEvent。

覆盖事件时,如果不希望将事件传播到其他对象,则需要接受事件以告知系统您已处理了该事件。

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

在不接受事件的情况下,双击将传递给QGraphicsScene,然后传递给QGraphicsItem。

如果您希望能够在单击场景的空白区域时双击以创建一个项目,但是如果双击某个项目使项目具有反应,则可以覆盖场景的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
}
Run Code Online (Sandbox Code Playgroud)