Что делают QPainter :: save () и QPainter :: restore ()? - PullRequest
9 голосов
/ 10 июня 2010

Я не уверен, что именно делает QPainter, когда я вызываю save() и restore().

Сохраняет ли оно изображение, которое рисует, или просто сохраняет информацию, например penWidth и color и т. Д .?
Могу ли я использовать его для восстановления изображения предыдущего события рисования?

Ответы [ 3 ]

9 голосов
/ 10 июня 2010

С документация :

Вы можете в любое время сохранить состояние QPainter, вызвав функцию save (), которая сохраняет все доступные настройки во внутреннем стеке. Функция restore () возвращает их обратно.

Все эти настройки перечислены по данной ссылке. Так что это просто сохранение настроек рисования и ничего, что на самом деле нарисовано.

8 голосов
/ 11 июня 2010

Поскольку вы, вероятно, изменяете цвет и стиль или любые другие настройки краски, вы обычно хотите выйти из функции рисования с теми же настройками, что и при входе. Поэтому вы используете QPainter::save() перед изменением настроек художникаи QPainter::restore() после завершения рисования с измененными настройками, например,

void paint( QPainter* painter,
            const QStyleOptionGraphicsItem* option,
            QWidget* widget = 0 )
{
    // Painter has certain settings 
    painter->save();
    QPen pen = painter->pen();
    pen.setColor(QColor(200,20,20);
    // Changing settings of painter
    painter->setPen(pen);
    // ... Draw
    painter->restore();
    // Painter has same settings as on entry into this function
}

painter->save() помещает состояние рисователя в стек, painter->restore() извлекает состояние из стека и изменяет настройки насопоставьте это.

3 голосов
/ 11 июня 2010

Если кто-то использует функцию сохранения / восстановления, было бы неплохо иметь небольшой класс RAII («PainterSaver»), чтобы убедиться, что каждый save () (выполняется в ctor) имеет соответствующий вызов restore () (выполняется в dtor ), иначе можно столкнуться с неприятными ошибками «несбалансированного сохранения / восстановления».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...