Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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++ 按住Shift键绘制直线的算法_C++_Algorithm_Qt_Line - Fatal编程技术网

C++ 按住Shift键绘制直线的算法

C++ 按住Shift键绘制直线的算法,c++,algorithm,qt,line,C++,Algorithm,Qt,Line,我的项目中有line painter小部件。所以,我必须开发一种算法,当用户按下Shift键时,该算法允许将直线校正为直线。我在Photoshop和Paint中也看到过类似的情况。 但是我自己的方法不起作用。我正在使用Qt-libs。 代码在这里。PauredPoints_uu是QPointF的QList void GesturePaintSurface::mousePressEvent(QMouseEvent *event) { if (event->button

我的项目中有line painter小部件。所以,我必须开发一种算法,当用户按下Shift键时,该算法允许将直线校正为直线。我在Photoshop和Paint中也看到过类似的情况。 但是我自己的方法不起作用。我正在使用Qt-libs。 代码在这里。PauredPoints_uu是QPointF的QList

void GesturePaintSurface::mousePressEvent(QMouseEvent *event)    
{    
    if (event->button() == Qt::LeftButton)    
    {    
        isDrawingFinished_ = false;        
        drawedPoints_.clear();    
        firstPoint_ = event->pos();    
        drawedPoints_.append(firstPoint_);    
    }    
    else    
    {    
        event->ignore();    
        isDrawingFinished_ = true;   
    }   
} 

void GesturePaintSurface::mouseMoveEvent(QMouseEvent *event)    
{
    if (!isDrawingFinished_)
    {
        if (isShiftPressed_)
        {
            QPoint newPoint;

            if (abs(drawedPoints_.last().rx() - event->pos().rx()) < 5)
            {
                newPoint.rx() = firstPoint_.x();
                newPoint.ry() = event->pos().y();
            }
            else
            {
                newPoint.rx() = event->pos().x();
                newPoint.ry() = firstPoint_.y();
            }

            drawedPoints_.append(newPoint);
        }
        else
            drawedPoints_.append(event->pos());

        repaint();
    }
}   

对不起我的语言。提前谢谢

第一个问题是每次鼠标移动时都会附加点!第二个问题是,这种情况下,使垂直或水平线是错误的

应该是这样的:

void GesturePaintSurface::mouseMoveEvent(QMouseEvent *event)    
{
    if (!isDrawingFinished_)
    {
        QPoint newPoint;
        if (event->modifiers().test(Qt::ShiftModifier)) {
            newPoint = drawedPoints_.last();

            if (qAbs(newPoint.x()-event->x())<qAbs(newPoint.y()-event->y())) {
                newPoint.setY(event->y());
            } else {
                newPoint.setX(event->X());
            }
        } else {
            newPoint = event->pos();
        }
        if (drawedPoints_.count()>1) {
           drawedPoints_.last() = newPoint;
        } else {
           drawedPoints_.append(newPoint);
        }
        update(); // update is better then repaint!
    }
}

在什么情况下不起作用?你真的不想在你的直线上保持一个单独点的向量,并在每次鼠标移动事件中添加一个。取而代之的是为你的小部件找一个QPainter,并为每个鼠标移动事件在clean小部件的顶部重新绘制一条临时的单行线!已绘制完成。当你画好后,用你通常在绘画应用中使用的任何方法画好这条线,而不是一条线QPainter@Sneftel这不是街灯线![截图]@tux3当我将新点添加到列表中时,Qpainter从最后一点到new@DimaGurov这不是正确的方法,正如您所看到的,这是无法管理的。如果要绘制一条直线,则只需记住原点的位置,然后使用QPaint从该点到光标绘制一条干净的直线。不要试图建立一个点的向量,这比必要的复杂得多。