【问题标题】:how to use mouse move event for QGraphicsScene?如何为 QGraphicsScene 使用鼠标移动事件?
【发布时间】:2013-09-15 21:11:47
【问题描述】:

当鼠标按钮被按下和移动时,他们想拖动这条贝塞尔曲线..

我这样做了:

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);
}

这是正确的方法吗?

【问题讨论】:

    标签: qt mousemove qgraphicsscene


    【解决方案1】:

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

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

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

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

    在 QGraphicsView 中处理鼠标事件是可行的,但如果您引入更多的贝塞尔曲线或其他对象,您会发现您需要检查您需要与其中的哪些进行交互。在对象本身中处理它会为您解决这个问题。

    【讨论】:

    • 所以我必须继承 QGraphicsPathItem..或者如何在 QGraphicsItem 子类的对象中绘制或添加路径?
    • 你可以继承 QGraphicsPathItem,也可以创建一个类,将 QGraphicsPathItem 作为私有成员。第一个选项将是我的首选方法。子类化后,您可以使用 shape() 函数,该函数返回一个 QPainterPath,然后将提供 contains() 函数来测试鼠标是否在对象上方。
    • 我按照你的建议试过了。假设这个子类有 3 个对象,我在其中实现鼠标事件。但是现在如何检查三个对象中的哪一个导致了鼠标事件。我正在这样做: 1.subclassed QGraphicsPathItem 2.Created 此类的对象和painter path 对象 3.set path 为此对象 4.add this object to graphics view 这是正确的方法...需要指导吗??
    • 这就是重点,你不需要检查;因为您在类中实现鼠标事件,所以您只会收到相关类实例的鼠标事件。 Qt 会为你处理。如果您仍然不确定,请添加您尝试过的代码,作为对您问题的修改。
    【解决方案2】:

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

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

    【讨论】:

    • 我按照你的建议使用了 QGraphicsView 的子类......并且它有效。谢谢。但仍然没有像预期的那样发生拖拽。我的意思是当我按下右键时我希望曲线沿着鼠标指针移动。当鼠标指针实际上位于它的控制点之一上时,我希望能够拖动曲线。该怎么做?
    • @user2739283 你是说你的moseMoveEvent中的鼠标位置不是它应该在场景中的鼠标位置吗?如果是这种情况,请使用QGraphicsView::mapToScene(const QPoint & point)
    • 嘿,对不起,可能是我问错了问题。我希望能够像在 CAD 应用程序中拖动曲线一样拖动曲线。
    • 没有。实际上我想显示我的贝塞尔曲线的控制点。当用户单击该点并拖动鼠标时,我想重绘曲线,直到释放鼠标按钮。那么该怎么做呢?
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2016-09-05
    • 2013-04-22
    • 1970-01-01
    • 2023-03-19
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多