У меня есть виджет линейного художника в моем проекте. Итак, я должен разработать алгоритм, который позволяет исправить строку до прямой, когда пользователь нажал клавишу Shift. Я видел подобное в Photoshop и Paint. Но мой собственный метод не работает. Я работаю с Qt libs. Код здесь. drawedPoints_ является QList of QPointFАлгоритм для рисования прямой линии с нажатием кнопки Shift
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();
}
}
Извините за мой язык. заранее спасибо!
Каким образом это не работает? – Sneftel
Вы * действительно * не хотите поддерживать вектор отдельных точек в своей строке и добавлять один на каждое событие перемещения мыши. Вместо этого получите QPainter для своего виджета и перерисуйте временную одиночную строку поверх чистого виджета для каждого события перемещения мыши с помощью (! IsDrawingFinished_). Когда вы закончите рисовать эту линию, используя любой метод, который вы обычно используете в своем приложении для рисования (а не QPainter) – tux3
@Sneftel Это не стреловидная линия! [screenshot] (http://i68.fastpic.ru/big/2015/0109/58/f25cb6ff39598aaf55f49db4f7cb9d58.png) –