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私は最初にのことを疑っsaverestore、何か間違ったことをしているかもしれないので、私はそれらをコメントアウトしましたが、結局何も塗り直しませんでした。

ありがとう。

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 に答える