2011-12-04 2 views
0

그래픽 편집기를 구현하는 방법에 대해 약간의 질문이 있습니다. 그림의 경우이 방법을 사용합니다. 먼저 마우스 왼쪽 버튼을 클릭했는지 확인한 다음 QPixmap의 event-> pos()에서 한 픽셀을 그립니다. 그런 다음 update()를 호출합니다. 그것을 다시 그리기. 또한 QPixmap에 두 개의 점 사이에 선을 그려야합니다. 마우스가 눌려진 버튼으로 움직이면 (왜냐하면 그것 없이는 점들 만있을 것이기 때문입니다). 꽤 잘 작동하지만이 작업을 수행하는 데 더 최적화 된 방법이 있는지 알고 싶습니다. 여기에 몇 가지 코드의QPixmap의 최적화 된 그림

void Editor::paintEvent(QPaintEvent *event) 
{ 
    painter.drawPixmap(QRect(0, 0, image.width() * zoom , image.height() * zoom), 
          image); 
} 

void Editor::mousePressEvent(QMouseEvent *event) 
{ 

    if(event->button() == Qt::LeftButton) 
    { 
     setImagePixel(event->pos()); 
    } 

} 

void Editor::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(event->buttons() & Qt::LeftButton) 
    { 
     setImagePixel(event->pos(), true); 
    } 
} 

void Editor::setImagePixel(const QPoint &pos) 
{ 

    QPainter painter(&image); 
    if(image.rect().contains(i, j)) 
    { 
     painter.begin(&image); 
     painter.setPen(primaryColor); 
     painter.drawPoint(i, j); 
     painter.end(); 
    } 
} 

답변

1

예, 내가 손으로 만든 도형을 그릴 QPainterPath와 API를 사용합니다 (I 등 픽셀 사이에 실종 픽셀을 결합, 줌과 부품을 생략했다). 그 방법을 봐 : moveTo()lineTo(), 당신은 그림 논리 (픽셀 누락 등) 없애 버리게됩니다. 마우스 이벤트와 결합하는 것도 매우 쉽습니다.

희망이 도움이됩니다.

+0

와우 ... 정말 고마워요. 정말 도움이되었습니다.^_^ 휠을 다시 발명 할 필요가 없기 때문에 기쁩니다. 좋은 하루 되세요. –

+0

질문이 하나 더 있습니다. 다른 너비의 펜을 사용하려고했습니다. 그러나 이렇게 좋지는 않습니다 -> http://i.imgur.com/lNdKO.png. 나는 항상 많은 경로를 그리기 때문이라고 생각합니다. 이걸 어떻게 없앨 수 있습니까? –

+0

'QPainter :: setRenderHint (QPainter :: Antialiasing, true)'를 시도 했습니까? 나는 많은 경로를 항상 그려야 함을 이해하지 못합니다. 그러나 렌더링 된 결과와 관련이 있는지 확실하지 않습니다. – azf