Чтобы установить ограничение на перетаскиваемые отрезки - PullRequest
2 голосов
/ 06 января 2020

Я пытаюсь реализовать сегменты, которые можно перетаскивать мышью между двумя точками (показано ниже, где зеленые и красные линии должны перетаскиваться между черными линиями da sh).

пример изображения

Я могу перетаскивать линии мышью.

В качестве следующего шага я хочу установить предел для этой перетаскиваемой области, с которой у меня возникают проблемы при реализации , Я действительно ценю, если кто-то может помочь мне сделать это. Теперь я объясню ситуацию немного подробнее:

.h - это:

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
     void paintEvent(QPaintEvent *e);

public slots:

      void changeP1value(int);


private:
    Ui::MainWindow *ui;
     bool dragging = false; 
     QPoint p1 = QPoint(400,100);
     QPoint p2 = QPoint(450,100);
     QPoint p3 = QPoint(450,100);
     QPoint p4 = QPoint(500,100);

     QPoint *CurPoint1=nullptr;
     QPoint *CurPoint2=nullptr;

protected:
     virtual void mousePressEvent(QMouseEvent *event) override;
     virtual void mouseReleaseEvent(QMouseEvent *event) override;
     virtual void mouseMoveEvent(QMouseEvent *event) override;
};
#endif // MAINWINDOW_H

и в .cpp файле:

// small helper to give us the distance
int distance(QPoint x1, QPoint x2)
{
    return abs(x2.y() - x1.y());
}

// the Paint event to draw lines
void MainWindow::paintEvent(QPaintEvent *e)
{
    QPainter painter1(this);

    QPen pointpen(Qt::black);
    pointpen.setWidth(5);
    QPen linepen1(Qt::red);
    linepen1.setWidth(2);
    QPen linepen2(Qt::green);
    linepen2.setWidth(2);

    painter1.setPen(linepen1);
    painter1.drawLine(p1,p2);
    painter1.setPen(linepen2);
    painter1.drawLine(p3,p4);

}

// when user clicks
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    QPoint mp = event->pos(); // where is mouse
// test if we hit the line. give user 20 pixels slack as its hard to hit one pixel
    if (distance ( mp, p1) < 20 && ( mp.x() > p1.x() && mp.x() < p2.x() ) ) {
        dragging = true; // flag we are dragging


        CurPoint1 = &p1;
        CurPoint2 = &p2;
    }
    else if (distance ( mp, p3) < 20 && ( mp.x() > p3.x() && mp.x() < p4.x() ) ) {
        dragging = true;
        CurPoint1 = &p3;
        CurPoint2 = &p4;
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    dragging = false; // if user release mouse we are not draggign anymore
}

// then when mouse move
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
 // If we are dragging, call your normal slider changed function to update your points.

    if (dragging)
    {
      if(CurPoint1->y()>50 && CurPoint1->y()<150) 
        {
        changeP1value(event->y());
        }
      else
      update();
    }

}

void MainWindow::changeP1value(int value)
{

    CurPoint1->setY(value);
    CurPoint2->setY(value);
    update();

}

В mouseMoveEvent, У меня есть условие, чтобы проверить, перетаскиваю ли я линию, и если высота между 50 и 150:

 if (dragging)
    {
      if(CurPoint1->y()>50 && CurPoint1->y()<150) //----> it get stucked and cannot be dragged down again 
        {
        changeP1value(event->y());
        }
      else
      update();
    }

В этом случае я могу перетащить, линия останавливается в установленных пределах, но я не могу перетащить вниз снова. Вы можете определить проблему?

Заранее спасибо

1 Ответ

2 голосов
/ 06 января 2020

Вам необходимо проверить новое y значение, а не текущее значение:

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
  if (dragging)
  {
    if(event->y() > 50 && event->y() < 150) 
    {
      changeP1value(event->y());
    }
    else
      update();
  }
}
...