QPainter Save State

У меня есть QWidget, в котором я использую объект QPainter для рисования некоторых точек, но когда вызывается метод update (), рисование QWidget полностью очищается. Есть ли способ сохранить фактическое состояние и просто добавить точки, или мне нужно сохранить каждую точку и нарисовать их в каждом вызове paintEvent ()? В основном, когда я нажимаю стрелку, я должен показать линию на QWidget (это для автомобильного ралли).

1

Решение

В дополнение к SingerOfTheFallВ ответ вы также можете нарисовать все свои инкрементные изменения в изображении, а затем рисовать только это изображение при каждом вызове обновления.

Для работы с изображениями в Qt есть несколько классов, наиболее важными из которых являются: QImage а также QPixmap и так как они оба получены из QPaintDevice, они могут быть непосредственно втянуты с QPainter, В то время как QImage оптимизирован для прямого доступа к пикселям и файлового ввода-вывода, QPixmap оптимизирован для отображения на экране. Там не сказано, какой из них лучше использовать, но я бы начал с QPixmap и посмотрим, как это работает.

Существует также другой класс «image», в который вы можете рисовать, QPicture. Но на самом деле это не изображение, хранящее результирующий рендеринг, а просто записывает команды рисования, выполненные с помощью QPainter быть легко воспроизведенным позже. Поэтому я думаю, что его производительность не должна быть намного лучше, чем у «реального» изображения. Но, возможно, стоит попробовать, особенно если на чертеже происходит что-то более сложное, и простого сохранения окончательного изображения недостаточно.

2

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

QPainter просто не могу сохранить «государство», потому что это не его цель. Единственное, что он делает, это рисование. После того, как вы скажете ему нарисовать линию от [x, y] до [x1,Y1], это рисует, и «забывает» все. каждый paintEvent() начинает рисовать виджет с нуля. Таким образом, чтобы добавить элементы, вам придется каждый раз перерисовывать существующие.

1

На самом деле я решаю свою проблему, используя QPainterPath поэтому я могу сгруппировать эллипсы для рисования «динамических» линий:

QPainterPath* p = new QPainterPath(this); //this should be a class attribute to save all points
p->addEllipse(myCustomPoint); //we should add the points dynamically

QPainter painter(this); // On QPainter::paintEvent;
painter.drawPath(p);
0
По вопросам рекламы [email protected]