在Qt中实现mousePressEvent和setDragMode

Implementing mousePressEvent and setDragMode in Qt

本文关键字:setDragMode mousePressEvent 实现 Qt      更新时间:2023-10-16

我正在做一个项目,我应该在QGraphicsScene上实现mousePressEvent和setDragMode。我可以单独执行,但我应该同时执行两者。我将两者都包含在代码中,但只有mousePressEvent在工作,无法拖动场景。你能请任何人告诉我如何实现这两个吗。请查找所附代码。谢谢。

MyGraphicsView.cpp

MyGraphicsView::MyGraphicsView(QWidget* parent) : QGraphicsView(parent) {
Scene = new QGraphicsScene(this);
setScene(Scene);
setDragMode(ScrollHandDrag);
}
void MyGraphicsView::mousePressEvent(QMouseEvent *eve)
{ 
if (eve->button() == Qt::LeftButton) {
// handle Left mouse button here
QPointF pt = mapToScene(eve->pos());
}
}

MyGraphicsView.h

class MyGraphicsView : public QGraphicsView
{  
Q_OBJECT   
protected:
virtual void mousePressEvent(QMouseEvent *eve);
}

从QGraphicsView DragMode属性上的Qt文档:

(…)默认值NoDrag不执行任何操作。

此行为只影响未由任何项目处理的鼠标单击。您可以通过创建QGraphicsView的子类并重新实现mouseMoveEvent()来定义自定义行为。

这可能就是为什么当您实现mousePressEvent时,您不能使DragMode开始工作的原因:事件被处理,所以Qt框架认为;作业完成";,并且不需要触发拖动。

文档建议重新实现mouseMoveEvent。它仍然提供QMouseEvent,因此您可以获得坐标以及当前按下的鼠标按钮的信息。从那时起,您只需要为Idle实现一个状态机;StartDrag;拖曳FinishDrag

根据移动过程中按下的按钮,并在需要的任何状态下实现所需的功能。