2012-06-14 57 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()中刪除該區域,整個小部件將重新繪製,並且您的顏色更改將正常工作。