派生QPainterPath,QPainter性能迅速降低

时间:2012-12-13 15:32:07

标签: c++ qt qpainter

我目前正在尝试将我的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();
}

在实际的Widget中,我正在执行以下操作

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

1 个答案:

答案 0 :(得分:1)

我发现这与我只创建了一次对象,然后在arcTo 的每次运行期间为其添加了paint()和其他一些行。由于我无法刷新QPainterPath,因此Path变得越来越长,越来越长。

这解释了为什么老线没有被冲洗以及为什么刷子是交替的(每次我重新绘制相同的东西,我正在与路径本身形成一个新的交叉点,因为设计没有被填充)。

我这样修好了:

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后,该绘制的路径将被丢弃。