2012-07-04 4 views
2

Qt를 사용하여 C++에서 Paint 응용 프로그램을 만들려고합니다. 클릭하거나 클릭 할 때마다 & 마우스를 드래그하면 프로그램이 pixmap에 무언가를 그릴 것입니다. 그런 다음, 창에 pixmap을 그릴 paintEvent()를 호출하는 윈도우를 업데이트합니다.Qt drawPixmap이 예상 한 그림을 그리지 않습니다.

void QPaintArea::mousePressEvent(QMouseEvent *event){ 
    startpoint = event->pos(); 
    drawPoint(startpoint); 
    is_pressed = true; 
} 

void QPaintArea::mouseReleaseEvent(QMouseEvent *event){ 
    is_pressed = false; 
} 

void QPaintArea::mouseMoveEvent(QMouseEvent *event){ 
    if(is_pressed == true){ 
     endpoint = event->pos(); 
     drawLine(startpoint, endpoint); 
     startpoint = endpoint; 
    } 
    else{ 
     return; 
    } 
} 

void QPaintArea::paintEvent(QPaintEvent *event){ 
    QDesktopWidget *desktop = QApplication::desktop(); 
    int x = (desktop->width() - 800)/2; 
    int y = (desktop->height() - 600)/2; 
    QPainter painter(this); 
    QRect target(QPoint(x, y - 35), QSize(800, 600)); 
    QRect dirtyrect(QPoint(0,0), QSize(800, 600)); 
    painter.drawPixmap(target, *pixmap, dirtyrect); 
} 

문제는 프로그램이 예상대로 창에 pixmap을 인쇄하지 않는다는 것입니다. 예를 들어 x : 17, y : 82에서 마우스를 눌러 무언가를 그립니다. 이 프로그램은 내가 그린 것부터 x + 20, y와 같은 오프셋 된 위치에 인쇄합니다.

아마도 QRect 또는 drawPixmap 작동 방식을 완전히 이해하지 못했지만 pixmap은 800x600입니다. "dirtyrect"는 전체 pixmap (x : 0, y : 0 및 크기 800x600 시작)을 저장해야합니다.

+0

QPaintArea 무엇을, 해당 이벤트의 위치를 ​​기억 상대적 위젯, 당신이, 당신의 픽스맵 예를 들어 약간의 여백을 그래서 만약 위치는 0 + margin-left, 0 + margin-top –

+0

QPaintArea는 나로 만든 클래스입니다. – Kanghu

+0

단지 힌트지만, Qt에 대해 Q 접두사를 유지하면, 당신을 위해 다른 것을 선택해야합니다 :). 레이아웃을 설정 했습니까? –

답변

3

drawPixmap (target, pixmap, source) 화가 영역 (이 경우 QPaintArea)의 대상 rect에 페인트합니다. pixmap의 원본 부분입니다. 그래서 당신은 QPaintArea의 일부 (x, y-35,800,600) rect에서 전체 pixmap (0,0,800,600)을 페인트합니다. 전체 QPaintArea에 전체 pixmap을 칠하려면 drawPixmap (QPoint (0,0), * pixmap) 만 사용하면됩니다.

// EDIT

그러나 당신이 예상하는 경우, 그 픽스맵은, 다음의 계산이 잘못 QPaintArea의 왼쪽 상단 모서리로부터의 오프셋 (offset) 일부와 그린을 받고 실 거예요 무슨 짓을했는지 설명하면 우리가 원 달성하고자 ' 너를 도울 수있어. y, y에 대한 계산을 설명하면 어쩌면 우리가 뭔가를 알아낼 수있을 것입니다.

// EDIT -35와 같은 창 오프셋을 사용할 필요가 없습니다. 위젯에 다시 그리기. 위젯의 0,0은 윈도우 프레임의 왼쪽 상단이 아니라 위젯 내용입니다. 다른 플랫폼에서 어떻게 작동 할 것으로 기대합니까? 당신이 당신의 윈도우의 중간에 페인트하려면

단순히 사용

void QPaintArea::paintEvent(QPaintEvent *event){ 
    QPoint middle = geometry.center(); 
    int x = middle.x() - 800/2; // probably best would be pixmap->width()/2 
    int y = middle.y() - 600/2; // probably best would be pixmap->height()/2 
    QPainter painter(this); 
    painter.drawPixmap(QPoint(x,y), *pixmap); 
} 
+0

나는 창 중앙에 사각형에 pixmap을 그려 넣고 싶다. x와 y는 좌표입니다. 내 프로그램의 창은 전체 화면으로 설정되어 있으므로 프로그램 창의 크기는 바탕 화면 크기와 동일합니다. 바탕 화면 크기를 가져 와서 pixmap 크기를 줄이고 2로 나눕니다. -35는 바탕 화면의 크기가 아니라 프로그램 창의 크기가되기 때문에 메뉴 막대와 다른 것들을 줄여야합니다. 창 중앙에 픽스맵을 그려 넣고 싶습니다. – Kanghu

+0

편집 된 답변보기 –

+0

나는 그것을 시험해 보았다. 그러나이 프로그램은 똑같은 문제가 있습니다. – Kanghu

관련 문제