问题描述:软件中用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);
}
}
是把事件向上传递给父类去响应,就是在子类中“忽略”了这个事件。
在QT应用中,使用QGraphicsView子类MainView显示图像和自定义图形标记。遇到的问题是,当同时重写QGraphicsView和ShapeTagItem的mousePressEvent时,图形标记的事件无法响应。分析发现,事件首先由QGraphicsView处理,然后传递给QGraphicsScene和QGraphicsItem。解决方案是在QGraphicsView的mousePressEvent中,通过调用QGraphicsView::mousePressEvent(event)将未处理的事件传递给父类,以确保事件能正确到达图形标记。
339

被折叠的 条评论
为什么被折叠?



