实现这样的一个程序,把 QPainter 的坐标原点从左上角移动到 (100, 100),然后画出坐标轴,接下来顺时针旋转坐标轴 45 度,设置画笔,画刷,字体,画一个矩形和字符串,最后恢复 QPainter 到最开始的状态,即还原画笔,画刷,字体,逆时针旋转坐标轴 45 度,移动 QPainter 的坐标原点到左上角,再画一个矩形和字符串,就像下图这样:

在不了解 QPainter 的 save() 和 restore() 之前,我们可能会下面这样做:

void CodeStatusWidget::paintEvent(QPaintEvent *) {QPainter painter(this);// [*] 保存 QPainter 的状态QPen pen = painter.pen();QBrush brush = painter.brush();QFont font = painter.font();// 移动坐标轴painter.translate(100, 100);// 绘制坐标轴所在的线painter.drawLine(-100, 0, 100, 0);painter.drawLine(0, -100, 0, 100);painter.rotate(45);painter.setPen(Qt::red);painter.setBrush(Qt::blue);painter.setFont(QFont("Monaco", 30));painter.drawRect(-50, -50, 100, 100);painter.drawText(0, 0, "Hello");// [*] 恢复 QPainter 的状态painter.rotate(-45);painter.translate(-100, -100);painter.setFont(font);painter.setPen(pen);painter.setBrush(brush);painter.drawRect(250, 50, 100, 100);painter.drawText(250, 50, "Hello");
}

为了能够恢复 QPainter 的状态,首先要保存 QPainter 的状态

QPen pen = painter.pen();
QBrush brush = painter.brush();
QFont font = painter.font();

最后使用下面的代码恢复 QPainter 的状态

painter.rotate(-45);
painter.translate(-100, -100);
painter.setFont(font);
painter.setPen(pen);
painter.setBrush(brush);

看上去不是很难,但是在绘制复杂图形的时候,恢复 QPainter 状态的操作就会很频繁,很有可能导致代码难以管理。如果仔细阅读 QPainter 的帮助文档,就会发现其实 QPainter 已经提供了接口用于保存和恢复它的状态,就是 save() 和 restore()。

    void QPainter::save() - Saves the current painter state (pushes the state onto a stack). A save() must be followed by a corresponding restore().void QPainter::restore() - Restores the current painter state (pops a saved state off the stack).

save() 用于保存 QPainter 的状态,restore() 用于恢复 QPainter 的状态,save() 和 restore() 一般都是成对使用的,如果只调用了 save() 而不调用 restore(),那么保存就没有意义了,保存是为了能恢复被保存的状态而使用的。QPainter 的状态有画笔,画刷,字体,变换(旋转,移动,切变,缩放)等。

下面就使用 QPainter 提供的功能保存和恢复它的状态,看看代码会是怎么样的

void ApiStatusWidget::paintEvent(QPaintEvent *) {QPainter painter(this);// [*] 保存 QPainter 的状态painter.save();// 移动坐标轴painter.translate(100, 100);// 绘制坐标轴所在的线painter.drawLine(-100, 0, 100, 0);painter.drawLine(0, -100, 0, 100);painter.rotate(45);painter.setPen(Qt::red);painter.setBrush(Qt::blue);painter.setFont(QFont("Monaco", 30));painter.drawRect(-50, -50, 100, 100);painter.drawText(0, 0, "Hello");// [*] 恢复 QPainter 的状态painter.restore();painter.drawRect(250, 50, 100, 100);painter.drawText(250, 50, "Hello");
}

利用 save() 和 restore() 后,就不需要开始的时候一个一个的保存和恢复 QPainter 的状态了,调用一下 save(),QPainter 的所有状态就保存好了,需要恢复的时候只要调用 restore() 所有保存好的状态就恢复回来了,代码简洁了很多,也不会不小心漏掉某些状态而出错。

此外,save() 和 restore() 可以以堆栈的形式嵌套式地保存和恢复,最后保存的先恢复:

void MainWidget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.save(); // 保存状态 1...painter.save(); // 保存状态 2...painter.save();    // 保存状态 3...painter.restore(); // 恢复状态 3...painter.save();    // 保存状态 4...painter.restore(); // 恢复状态 4painter.restore(); // 恢复状态 2...painter.restore(); // 恢复状态 1
}

本文转自:QPainter 的状态保存与恢复_TemetNosce的博客-CSDN博客_qpainter restore

QPainter 的状态保存与恢复相关推荐

  1. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  2. android 自动恢复,Android的状态保存和恢复

    Activity的状态保存和恢复 Activity的状态什么时候需要保存和恢复 Activity的销毁一般分为两种情况: 当用户按返回按钮或你的Activity通过调用finish()销毁时,这属于正 ...

  3. 安卓自定义View的状态保存与恢复

    安卓自定义View的状态保存与恢复 我们在开发某些安卓应用(如安卓小游戏)时,可能会用到自定义View,这时候往往需要保存自定义View的状态信息,以便在遇到某些情况(如由于系统内存资源紧张被系统杀死 ...

  4. Flink 的状态保存和恢复

    前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...

  5. 前端:JS/38/canvas状态的保存和恢复(canvas常用状态大全),canvas画布中图像的变形

    canvas状态的保存和恢复 Saving and restoring state 在了解变形之前,我先介绍两个在你开始绘制复杂图形时必不可少的方法. canvas.save() 保存画布(canva ...

  6. activity状态的保存和恢复

    activity状态的保存和恢复 一.简介 1.保存activity状态 * 保存activity状态,onSaveInstanceState这个方法会自动保存有ID的组件的状态 * 没有ID的组件或 ...

  7. 保存和恢复应用程序状态

    在实际应用中,常常需要应用程序能保存程序的状态以及用户的设置,如应用程序显示的大小.位置.背景颜色或用户设置参数等信息,以便下次运行程序时,能保持上次关闭的状态. Qt提供的QSettings类能很方 ...

  8. iOS开发那些事--iOS6 UI状态保持和恢复

    iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的.iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了. 在 ...

  9. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简介 1. 状态保存方法示例 p ...

最新文章

  1. linux搭建gitlab内网,ubuntu14搭建内网gitlab服务器(示例代码)
  2. Tomcat8.0之源代码初体验
  3. 数字IC验证学习(二)
  4. JAVA格式化当前日期或者取年月日
  5. php 异常错误信息用处,关于PHP中异常错误的处理详细介绍
  6. 你应该知道的Windows复制技术
  7. unity模型任意无限切割插件
  8. 浅析C++开发工程师的高薪就业方向
  9. matlab符号运算实验,数学实验6--Matlab符号运算.pptx
  10. php5.3升级脚本
  11. Android office教程,Excel办公软件Office教程app
  12. 人脸检测高级:疲劳检测
  13. android log抓取工具,Android PC端用ADB抓取指定应用日志实现步骤
  14. 金蝶星空支持mysql吗_金蝶云星空K3 CLOUD SQL 数据库优化
  15. Windows应用程序未响应怎么办文件还没保存呢,是什么原因导致的应用程序未响应?
  16. IP签名档PHP源码,简单几步,教你制作自己的显IP签名档
  17. Java程序性能优化——设计优化
  18. PAT(甲级) 1003. Emergency
  19. 系综理论(Ensemble Theory)
  20. ubuntu16.04中安装Kdevelop和使用技巧

热门文章

  1. 为何程序员上班时间总戴个耳机,看完恍然大悟...
  2. dns的服务器地址是多少当前位置,dns的服务器地址设置为多少
  3. 软件测试与开发专业就业方向,学习软件测试后就业方向有哪些?
  4. notes系统服务器地址,notes怎么连接服务器地址
  5. 小学五年级计算机备考方案,五年级数学备考计划_备考经验
  6. [UE4]解析json数据
  7. logstash 中multiline插件的用法
  8. Mac系统安装nginx+rtmp模块
  9. php的autoload机制
  10. 查看ubuntu版本