В настоящее время я пытаюсь инкапсулировать свои объекты 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);
установлено …
Я обнаружил, что это связано со мной, только создавая объект один раз, затем добавляя 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
Тот нарисованный путь отбрасывается.
Других решений пока нет …