gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:59:49 31 4
gpt4 key购买 nike

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

我这样做了:

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

这是正确的方法吗?

最佳答案

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

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

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

};

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

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

关于qt - QGraphicsScene 如何使用鼠标移动事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18817538/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com