現在、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);
です...