2012-06-14 1 views
1

나는 Qt을 배우고 있습니다. 나는 the exercise of chapter 11 of Qt tutorial을 깨닫지 못하고 있는데, "샷이 공중에있을 때 캐논의 색을 바꿔라." paintCannon 함수의 변경을 구현하기로 결정했습니다 (아래). 아래 내 코드의 문제점은 무엇입니까?QPainter가 색상을 변경하지 않습니다.

void CannonField::paintCannon(QPainter &painter) 
{ 
    painter.setPen(Qt::NoPen); 
    if (autoShootTimer->isActive()){ 

     std::cout << "in paintCannon yellow; " << std::endl; 
     // This gets called everytime `paintEvent` occurs. 
     // Please see the code in the web page (http://doc.trolltech.com/4.3/tutorial-t11-cannonfield-cpp.html) for this part. 

     painter.setBrush(Qt::yellow); 
    }else{ 
     std::cout << "in paintCannon blue; " << std::endl; 
     painter.setBrush(Qt::blue); 
    } 

    painter.save(); 
    painter.translate(0, height()); 
    painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16); 
    painter.rotate(-currentAngle); 
    painter.drawRect(barrelRect); 
    painter.restore(); 
} 

는 내가 처음 Qpaintersaverestore 뭔가 잘못되었을 수 있습니다 의심 때문에, 나는 다시 그림 아무 것도 결국없는 그들을 밖으로 댓글을 달았습니다.

감사합니다.

+0

그려지는 대포의 색은 무엇입니까? –

+0

코드가하는 일은 무엇입니까? 이것이 어떻게 해야하는 것과 다른가? 예를 들어'PaintCannon blue '(또는'yellow')에서 출력하지만 다른 색상을 사용합니까, 아니면 무엇입니까? –

+0

@ Jeremy Friesner 대포는 처음에 그려진 색 인 파란색으로 유지됩니다. – IsaacS

답변

1

당신이 겪고있는 문제는이 루틴에 있습니다

void CannonField::moveShot() 
{ 
    QRegion region = shotRect(); 
    ++timerCount; 

    QRect shotR = shotRect(); 

    if (shotR.x() > width() || shotR.y() > height()) 
    { 
     autoShootTimer->stop(); 
    } 
    else 
    { 
     region = region.unite(shotR); 
    } 
    update(region); 
} 

촬영이 이동, update() 지정 지역으로 호출되고있다. 그 결과 샷 사각형 만 다시 칠합니다. update() 호출에서 영역을 제거하면 전체 위젯이 다시 칠되고 색상 변경이 올바르게 작동합니다.