2

我在学习Qt。我没有意识到Qt 教程第 11 章的练习,其中指出“在空中射击时更改大炮的颜色”。我选择在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'ssave并且restore可能做错了什么,所以我将它们注释掉,最终没有重新绘制。

谢谢。

4

1 回答 1

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(),则整个小部件将被重新绘制,并且您的颜色更改将正常工作。

于 2012-06-14T02:01:03.247 回答