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中主动捕获鼠标位置的实现方法?
为啥鼠标右键单击在按下时会触发“pointerdown”事件,但在释放时不会触发“pointerup”事件?