QGraphicsView右键鼠标按下事件问题

时间:2011-02-09 23:52:21

标签: qt mouseevent qgraphicsview

我有一个View类,它是从QGraphicsView类重新实现的。

当我用右键单击鼠标时,我正在尝试绘制一条线。

这是我的mousePressEvent,mouseReleaseEvent和mouseMoveEvent代码:


View::View(QWidget *parent) :  QGraphicsView(parent)
{
    setAcceptDrops(true);
    setDragMode(QGraphicsView::RubberBandDrag);
    posFirst = QPoint(0,0);
    setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
    pressed = false;
    area = new Area;
    setScene(area);
    selectionLine = new QGraphicsLineItem(0,0,0,0,0,area);
    selectionLine->setPen(QPen(Qt::DashLine));
}

void View::mousePressEvent(QMouseEvent *event){ if(event->button() == Qt::RightButton ){ posFirst.setX( event->pos().x() ); posFirst.setY( event->pos().y() ); pressed = true; selectionLine->setVisible(true); } QGraphicsView::mousePressEvent(event); }

void View::mouseReleaseEvent(QMouseEvent *event){ update(); pressed = false; selectionLine->setVisible(false); event->accept(); selectionLine->setLine(0,0,0,0); QGraphicsView::mouseReleaseEvent(event); }

void View::mouseMoveEvent(QMouseEvent *event){ if(pressed ){ selectionLine->setLine(posFirst.x() , posFirst.y() , event->pos().x() , event->pos().y() ); } QGraphicsView::mouseMoveEvent(event); }

但是这段代码不能正常工作。它不能正确捕获鼠标重新发生事件和鼠标移动事件。 如果我设置if(event-> button()== Qt :: LeftButton),那么它按预期工作。

我也试过Qt :: MidButton并且它有效。

RightButton有什么问题?

1 个答案:

答案 0 :(得分:3)

我认为问题出在图形视图的视口中。 QGraphicsView在视口上渲染场景,视口也是一个QWidget(可能是一个OpenGL视口,或其他东西)。所以这个视口捕获并处理所有事件。

最好在场景中观看鼠标按键事件,而不是在视图上观看。视图仅显示场景的一部分,您必须将视图坐标转换为场景坐标才能正确创建一条线。

我还想避免对场景/视图进行子类化,而是创建一个在QObject::installEventFilter场景中注册为事件过滤器的管理器对象。通过这种方式,您可以将不同的管理器插入到不同的场景中,而不需要继承。