Производная QPainterPath, производительность 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();
}

В фактическом виджете я делаю следующее

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

Решение

Я обнаружил, что это связано со мной, только создавая объект один раз, затем добавляя 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Тот нарисованный путь отбрасывается.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]