2

我有一个从 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 有什么问题?

4

1 回答 1

3

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

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

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

于 2011-02-11T01:51:03.040 回答