【问题标题】:What does QPainter::save () and QPainter::restore () do?QPainter::save () 和 QPainter::restore () 是做什么的?
【发布时间】:2010-06-10 17:10:10
【问题描述】:

我不确定当我调用save()restore()QPainter 做了什么。

是保存正在绘制的图像还是只是保存penWidthcolor 等信息?
我可以用它来恢复之前绘制事件的图像吗?

【问题讨论】:

    标签: qt


    【解决方案1】:

    来自the documentation

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

    所有这些设置都列在给定的链接中。所以它只是保存了绘制设置,并没有实际绘制。

    【讨论】:

    • 详细地说,这可以让你做一些事情,例如:你设置一支笔,做一些绘图,保存,更换笔,做一些绘图,恢复,用原件做更多的绘图笔。
    • 链接已失效,也许您可​​以在答案中包含该列表?
    【解决方案2】:

    由于您可能正在更改绘画的颜色和样式或任何其他设置,因此您通常希望以与进入时相同的设置退出绘画功能。因此,您在更改绘画设置之前使用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 的状态放在堆栈中,painter->restore() 从堆栈中拉出状态并更改设置以匹配它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • (相同概念请参见 QMutexLocker)
      • 我们收到了QSignalBlocker。我真的很想知道为什么我们从来没有收到QPainterStateRestorer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2020-07-16
      • 2014-08-31
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多