У меня есть QWidget, в котором я использую объект QPainter для рисования некоторых точек, но когда вызывается метод update (), рисование QWidget полностью очищается. Есть ли способ сохранить фактическое состояние и просто добавить точки, или мне нужно сохранить каждую точку и нарисовать их в каждом вызове paintEvent ()? В основном, когда я нажимаю стрелку, я должен показать линию на QWidget (это для автомобильного ралли).
В дополнение к SingerOfTheFallВ ответ вы также можете нарисовать все свои инкрементные изменения в изображении, а затем рисовать только это изображение при каждом вызове обновления.
Для работы с изображениями в Qt есть несколько классов, наиболее важными из которых являются: QImage
а также QPixmap
и так как они оба получены из QPaintDevice
, они могут быть непосредственно втянуты с QPainter
, В то время как QImage
оптимизирован для прямого доступа к пикселям и файлового ввода-вывода, QPixmap
оптимизирован для отображения на экране. Там не сказано, какой из них лучше использовать, но я бы начал с QPixmap
и посмотрим, как это работает.
Существует также другой класс «image», в который вы можете рисовать, QPicture
. Но на самом деле это не изображение, хранящее результирующий рендеринг, а просто записывает команды рисования, выполненные с помощью QPainter
быть легко воспроизведенным позже. Поэтому я думаю, что его производительность не должна быть намного лучше, чем у «реального» изображения. Но, возможно, стоит попробовать, особенно если на чертеже происходит что-то более сложное, и простого сохранения окончательного изображения недостаточно.
QPainter
просто не могу сохранить «государство», потому что это не его цель. Единственное, что он делает, это рисование. После того, как вы скажете ему нарисовать линию от [x, y] до [x1,Y1], это рисует, и «забывает» все. каждый paintEvent()
начинает рисовать виджет с нуля. Таким образом, чтобы добавить элементы, вам придется каждый раз перерисовывать существующие.
На самом деле я решаю свою проблему, используя 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);