如何使用QGraphicsScene的鼠标移动事件?

时间:2013-09-15 21:11:48

标签: qt mousemove qgraphicsscene

当按下并移动鼠标按钮时,他们想要拖动这条贝塞尔曲线。

我这样做了:

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
qDebug()<<"in mouse move - outside if";
if((e->buttons() & Qt::RightButton) && isStart && enableDrag)
{
    qDebug()<<"mouse dragging happening";
    xc2=e->pos().x();
    yc2=e->pos().y();
    drawDragBezier(xc2,yc2);
}
}

当我按下右键并开始在整个主窗口中移动鼠标时开始拖动..但是我只想在按下鼠标按钮并在QGraphicsScene中移动鼠标时才开始拖动。

如何解决这个问题?

编辑:

void mySubClass1::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
    qDebug()<<"in musubclass mouse press event: "<<event->pos().x()<<" "
<<event- >pos().y();
    if(shape().contains(event->pos()))
    {
        currPosX=event->pos().x();
        currPosY=event->pos().y();
        qDebug()<<"currPosX currPosY: "<<currPosX<<" "<<currPosY;
    }
}
}

主窗口类是:

{
myGPath=new mySubClass1();
myScene=new QGraphicsScene;
myScene->addItem(myGPath);
ui->graphicsView->setScene(myScene);


QPointF *startPoint=new QPointF(50,50);
myPaintPath=new QPainterPath(*startPoint);

myPaintPath->quadTo(100,25,200,200);

myGPath->setPath(*myPaintPath);
}

这是正确的方法吗?

2 个答案:

答案 0 :(得分:5)

就个人而言,要解决这个问题,我会采取不同的方法。

创建一个继承自QGraphicsItem(或QGraphicsObject,如果您需要信号和槽)的类来表示贝塞尔曲线。然后在此类中实现对象的mouseMoveEvent。

class MyBezierCurve : public QGraphicsItem
{
    protected:
        void mousePressEvent(QGraphicsSceneMouseEvent*);
        void mouseMoveEvent(QGraphicsSceneMouseEvent*);
        void mouseReleaseEvent(QGraphicsSceneMouseEvent*);

};

这样,当鼠标直接位于其控制点之一上时,对象可以在其mousePressEvent中检测到,并使用鼠标移动事件更新控制点,直到发布事件发生。

在QGraphicsView中处理鼠标事件会起作用,但是如果你引入更多贝塞尔曲线或其他对象,你会发现你需要检查你需要与哪些对象进行交互。在对象本身中处理它将为您处理。

答案 1 :(得分:3)

你应该继承QGraphicsView并检测那里的mouseMoveEvent。

class MyGraphicsView : public QGraphicsView
{
   Q_OBJECT
   ...
protected:       
   void mouseMoveEvent(QMouseEvent *event);  
   ... 
};