QGraphicsView的事件传递

来源:互联网 发布:阳江市阳东区网络问政 编辑:程序博客网 时间:2024/06/07 08:51

      问题描述:软件中用QGraphicsView的子类MainView来显示背景图像QGraphicsPixmapItem)、各种图形标记(ShapeTagItem-自定义QGraphicsItem子类)。重写QGraphicsView的mousePressEvent方法用以实现场景的放大与缩小功能,同时重写ShapeTagItem的mousePressEvent方法来处理对图形标记的选中与拖拽。当两个方法同时重写时ShapeTagItem的mousePressEvent的事件无法响应。

      问题分析:屏蔽QGraphicsView的mousePressEvent的方法,ShapeTagItem的mousePressEvent能够正常响应,说明ShapeTagItem的mousePressEvent事件被截获而未能处理。在QT的QGraphicsView架构中鼠标事件首先由QGraphicsView处理,若未处理传递给QGraphicsScene,然后再传递给对应位置的QGraphicsItem。QGraphicsView的mousePressEvent方法中除了进行自己关心的处理外,其它情况应让事件继续传递下去。

      问题解决              

void MainView::mousePressEvent(QMouseEvent *event)
{
     if(globalData.state == xx)

     {
                  // do something
      }

    else {
             QGraphicsView::mousePressEvent(event); 
        }
}

是把事件向上传递给父类去响应,就是在子类中“忽略”了这个事件。

0 0
原创粉丝点击