QGraphicsView右键鼠标按下事件问题

Posted

技术标签:

【中文标题】QGraphicsView右键鼠标按下事件问题【英文标题】:QGraphicsView Right button mouse press event problem 【发布时间】:2011-02-09 23:52:20 【问题描述】:

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

我正在尝试用右键单击鼠标时画一条线。

这是我的 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】:

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

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

我还想避免子类化场景/视图,而是创建一个管理器对象,该对象在场景中注册为QObject::installEventFilter 的事件过滤器。这样您就可以将不同的管理器插入到不同的场景中,而不必为继承而烦恼。

【讨论】:

以上是关于QGraphicsView右键鼠标按下事件问题的主要内容,如果未能解决你的问题,请参考以下文章

求qt在QGraphicsView中主动捕获鼠标位置的实现方法?

阻止 QGraphicsView 的一些鼠标事件

为啥鼠标右键单击在按下时会触发“pointerdown”事件,但在释放时不会触发“pointerup”事件?

怎么在QGraphicsView上实现鼠标移动事件

重新实现鼠标事件时对 QGraphicsView 的奇怪影响

如何在 QGraphicsView 中启用平移和缩放