通过按住 Shift 按钮绘制直线的算法



我的项目中有线条画家小部件。所以,我必须开发算法,当用户按下Shift键时,它允许将直线更正为直线。我在Photoshop和Paint中看到过类似的情况。但是我自己的方法行不通。我正在使用Qt库。在这里编码。drawedPoints_是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!
    }
}