我目前正在尝试将我的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后,该绘制的路径将被丢弃。

10-08 08:54