在Qt

时间:2015-04-27 06:29:46

标签: c++ qt

我正在做一个项目,我应该在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);
}

1 个答案:

答案 0 :(得分:0)

来自QGraphicsView关于DragMode属性的Qt文档:

  

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

     

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

这可能就是为什么在实现 mousePressEvent 时无法使DragMode开始工作的原因:事件被处理,因此Qt框架认为"作业是完成",无需触发拖动。

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

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