QPainter不会改变颜色

时间:2012-06-14 00:56:47

标签: c++ qt qpainter

我正在学习Qt。我没有意识到the exercise of chapter 11 of Qt tutorial,其中指出“当空中射击时改变大炮的颜色。”我选择在paintCannon函数中实现更改(如下)。我的代码下面有什么问题?

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();
}

由于我第一次怀疑Qpainter的{​​{1}}和save可能做错了什么,我对它们进行了评论,最终没有重新绘画。

感谢。

1 个答案:

答案 0 :(得分: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()中删除该区域,则会重新绘制整个窗口小部件,并且您的颜色更改将正常工作。