2015-01-08 2 views
0

У меня есть виджет линейного художника в моем проекте. Итак, я должен разработать алгоритм, который позволяет исправить строку до прямой, когда пользователь нажал клавишу 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(); 
    } 
} 

Извините за мой язык. заранее спасибо!

+1

Каким образом это не работает? – Sneftel

+0

Вы * действительно * не хотите поддерживать вектор отдельных точек в своей строке и добавлять один на каждое событие перемещения мыши. Вместо этого получите QPainter для своего виджета и перерисуйте временную одиночную строку поверх чистого виджета для каждого события перемещения мыши с помощью (! IsDrawingFinished_). Когда вы закончите рисовать эту линию, используя любой метод, который вы обычно используете в своем приложении для рисования (а не QPainter) – tux3

+0

@Sneftel Это не стреловидная линия! [screenshot] (http://i68.fastpic.ru/big/2015/0109/58/f25cb6ff39598aaf55f49db4f7cb9d58.png) –

ответ

0

Первая проблема заключается в том, что вы добавляете точку при каждом перемещении мыши! Вторая проблема заключается в том, что это условие для вертикальной или горизонтальной линии неверно.

Это должно быть так:

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! 
    } 
} 
Смежные вопросы