派生的QPainterPath,QPainter性能迅速下降

Derived QPainterPath, QPainter performance degrading quickly

本文关键字:性能 QPainter QPainterPath 派生      更新时间:2023-10-16

我目前正在尝试将我的QPainter对象封装到可重用的类中,可能相互派生。这使他们能够以任何他们喜欢的方式改变画家,有自己的孩子画画等:

我有DrawArcQPainterPath衍生出来的

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();
}

以及源自DrawArcDrawBeam

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);仍然可见......

我发现这与我只创建一次对象有关,然后在每次运行paint()期间向其添加arcTo和其他几行。由于我无法刷新 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后,该绘制的路径将被丢弃。