QPainter::save()和QPainter::restore()分别是什么意思?

14

当我调用save()restore()时,我不确定QPainter在执行什么操作。

它是将绘制的图像保存下来,还是仅保存像penWidthcolor一类的信息?
我是否可以使用它来恢复先前的绘制事件中的图像?

3个回答

14

来自文档:

您可以随时通过调用save()函数保存QPainter的状态,该函数将所有可用设置保存在内部堆栈中。 restore()函数会将它们弹出。

所有这些设置都列在给定的链接中。因此,只是保存了绘画设置而没有实际绘制任何内容。


4
更详细地说,这可以让你做一些事情,比如:你先设置一个笔,画一些东西,保存,然后换掉笔,再画一些东西,恢复之前的状态,用原来的笔继续画。 - user21037

11

当您更改绘制设置的颜色、样式或其他任何设置时,通常希望在退出绘图函数时保留与进入时相同的设置。因此,在更改绘图器设置之前使用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()从堆栈中取出状态并改变设置以匹配该状态。


7
如果经常使用save/restore,那么最好有一个小的RAII类(“PainterSaver”)来确保每个save()(在构造函数中完成)都有相应的restore()调用(在析构函数中完成),否则可能会遇到令人讨厌的“不平衡的save/restore”错误。

(请参考QMutexLocker,了解相同的概念) - Frank Osterfeld
1
我们有 QSignalBlocker。我真的很想知道为什么我们从来没有得到过一个 QPainterStateRestorer - Parker Coates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接