C++ 按住Shift键绘制直线的算法
我的项目中有line painter小部件。所以,我必须开发一种算法,当用户按下Shift键时,该算法允许将直线校正为直线。我在Photoshop和Paint中也看到过类似的情况。 但是我自己的方法不起作用。我正在使用Qt-libs。 代码在这里。PauredPoints_uu是QPointF的QListC++ 按住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
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从该点到光标绘制一条干净的直线。不要试图建立一个点的向量,这比必要的复杂得多。