派生QPainterPath,QPainter性能下降很快
Posted
技术标签:
【中文标题】派生QPainterPath,QPainter性能下降很快【英文标题】:Derived QPainterPath, QPainter performance degrading quickly 【发布时间】:2012-12-13 15:32:07 【问题描述】:我目前正在尝试将我的 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);
...
【问题讨论】:
Also all elements deriving from DrawArc painting seem to sometimes lose their QBrush styles
你正在拯救画家……
据我所知,painter->save()
和 painter->restore()
让我为我的画家拍一张快照,这样我就可以在完成后展开回到它,撤消所有转换并取消选中的钢笔、画笔等。
它开启了在绘画过程中使用不同风格的可能性。
顺便说一句,性能损失与什么相比?您的帖子中似乎没有其他选择。
与程序启动后相比。没有数据被更改,但重复绘制会使连续绘制变慢。
【参考方案1】:
我发现这与我只创建一次对象有关,然后在每次运行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
后,绘制的路径将被丢弃。
【讨论】:
以上是关于派生QPainterPath,QPainter性能下降很快的主要内容,如果未能解决你的问题,请参考以下文章