0

現在、QPainter オブジェクトを再利用可能なクラスにカプセル化し、相互に派生させようとしています。これにより、ペインターを好きなように変換したり、自分の子供を描いたりすることができます。

私はDrawArcから派生しましたQPainterPath

DrawArc::DrawArc() : QPainterPath()
{}

void DrawArc::paint(QPainter* painter)
{
    painter->save();
    //...
    arcTo(/*...*/);
    lineTo(/*...*/);
    painter->translate(QPoint(100,100));
    painter->drawPath(*dynamic_cast<QPainterPath*>(this));
    painter->restore();
}

からDrawBeam派生したDrawArc

DrawBeam::DrawBeam() : DrawArc()
{}

void DrawBeam::paint(QPainter* painter)
{
    painter->save();
    //...
    painter->setPen(QPen(color, 4));
    painter->setBrush(brush);
    DrawArc::paint(painter);
    painter->restore();
}

実際のウィジェットでは、次のことを行っています

BeamWidget::BeamWidget(QWidget* parent) : QWidget(parent)
{
    DrawBeam* mybeam = new DrawBeam();
}

void BeamWidget::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    mybeam->paint(&painter);
}

painter->drawPath(*dynamic_cast<QPainterPath*>(this));ただし、数秒後 (または数百回の再描画)で劇的なパフォーマンスの低下が見られます。残りの手順の他のすべては正常に動作しているように見えますが、その行を有効にすると、パフォーマンスが急速に低下します。

また、ペイントから派生したすべての要素DrawArcが QBrush スタイルを失い、設定されていても表示されたままになることがあるようsetAutoFillBackground(true);です...

4

1 に答える 1

1

これは、オブジェクトを1回だけ作成し、の実行ごとarcToにオブジェクトに1行と他の数行を追加することと関係があることがわかりました。QPainterPathをフラッシュできないため、パスはどんどん長くなっていきます。paint()

これは、古い線がフラッシュされない理由とブラシが交互になっている理由を説明しています(同じものを再描画するたびに、パス自体との新しい交差点を形成していますが、設計上は塗りつぶされていません)。

私はそれを次のように修正しました:

void DrawArc::paint(QPainter* painter)
{
    painter->save();
    //...

    QPainterPath path = QPainterPath(*this);
    path.arcTo(/*...*/);
    path.lineTo(/*...*/);

    painter->translate(QPoint(100,100));
    painter->drawPath(path);
    painter->restore();
}

したがって、各描画操作で、現在のパスのコピーを作成し、それに必要なすべての線を追加して、そのパスをペイントします。終了後paint、その描画されたパスは破棄されます。

于 2012-12-14T09:38:40.327 に答える