我目前正在尝试将我的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);
仍然可见...
答案 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
后,该绘制的路径将被丢弃。