我目前正在尝试将我的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
,所有从setAutoFillBackground(true);
绘画派生的元素似乎有时也会丢失其QBrush样式并保持可见。 最佳答案
我发现这与只创建对象一次有关,然后在每次运行arcTo
时向其中添加paint()
和其他几行。由于我无法刷新QPainterPath,因此路径变得越来越长。
这就解释了为什么不冲洗旧线条以及为什么画笔交替使用(每次我重新绘制相同的东西时,我都会与路径本身形成一个新的相交点,而不会被设计填充)。
我这样修复:
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
后,该绘制的路径将被丢弃。