0

我目前正在尝试将我的 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);已设置...

4

1 回答 1

1

我发现这与我只创建一次对象有关,然后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,该绘制的路径将被丢弃。

于 2012-12-14T09:38:40.327 回答