Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将限制设置为可拖动线段的步骤_C++_Qt_Qtgui - Fatal编程技术网

C++ 将限制设置为可拖动线段的步骤

C++ 将限制设置为可拖动线段的步骤,c++,qt,qtgui,C++,Qt,Qtgui,我正在尝试实现两个点之间可以通过鼠标拖动的线段(如下所示,在黑色虚线之间必须可以拖动绿色和红色线) 样本图像 我可以用鼠标拖动线条 作为下一步,我想对这个可拖动区域设置一个限制,这是我需要解决的问题。如果有人能帮我,我真的很感激。我现在详细解释一下情况: .h是: public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void paintEvent(QPaintEvent *e); public

我正在尝试实现两个点之间可以通过鼠标拖动的线段(如下所示,在黑色虚线之间必须可以拖动绿色和红色线)

样本图像

我可以用鼠标拖动线条

作为下一步,我想对这个可拖动区域设置一个限制,这是我需要解决的问题。如果有人能帮我,我真的很感激。我现在详细解释一下情况:

.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();

}

在这种情况下,我可以拖动,线停止在设定的限制,但我不能再向下拖动。你能发现问题吗


提前感谢

您需要检查新的y值,而不是当前值:

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
  if (dragging)
  {
    if(event->y() > 50 && event->y() < 150) 
    {
      changeP1value(event->y());
    }
    else
      update();
  }
}
void主窗口::mouseMoveEvent(QMouseEvent*event)
{
如果(拖动)
{
如果(事件->y()>50&&event->y()<150)
{
更改p1Value(事件->y());
}
其他的
更新();
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
  if (dragging)
  {
    if(event->y() > 50 && event->y() < 150) 
    {
      changeP1value(event->y());
    }
    else
      update();
  }
}