我正在学习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
可能做错了什么,我对它们进行了评论,最终没有重新绘画。
感谢。
答案 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()
中删除该区域,则会重新绘制整个窗口小部件,并且您的颜色更改将正常工作。