QPainter 的状态保存与恢复
实现这样的一个程序,把 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 的状态保存与恢复相关推荐
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- android 自动恢复,Android的状态保存和恢复
Activity的状态保存和恢复 Activity的状态什么时候需要保存和恢复 Activity的销毁一般分为两种情况: 当用户按返回按钮或你的Activity通过调用finish()销毁时,这属于正 ...
- 安卓自定义View的状态保存与恢复
安卓自定义View的状态保存与恢复 我们在开发某些安卓应用(如安卓小游戏)时,可能会用到自定义View,这时候往往需要保存自定义View的状态信息,以便在遇到某些情况(如由于系统内存资源紧张被系统杀死 ...
- Flink 的状态保存和恢复
前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...
- 前端:JS/38/canvas状态的保存和恢复(canvas常用状态大全),canvas画布中图像的变形
canvas状态的保存和恢复 Saving and restoring state 在了解变形之前,我先介绍两个在你开始绘制复杂图形时必不可少的方法. canvas.save() 保存画布(canva ...
- activity状态的保存和恢复
activity状态的保存和恢复 一.简介 1.保存activity状态 * 保存activity状态,onSaveInstanceState这个方法会自动保存有ID的组件的状态 * 没有ID的组件或 ...
- 保存和恢复应用程序状态
在实际应用中,常常需要应用程序能保存程序的状态以及用户的设置,如应用程序显示的大小.位置.背景颜色或用户设置参数等信息,以便下次运行程序时,能保持上次关闭的状态. Qt提供的QSettings类能很方 ...
- iOS开发那些事--iOS6 UI状态保持和恢复
iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的.iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了. 在 ...
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简介 1. 状态保存方法示例 p ...
最新文章
- linux搭建gitlab内网,ubuntu14搭建内网gitlab服务器(示例代码)
- Tomcat8.0之源代码初体验
- 数字IC验证学习(二)
- JAVA格式化当前日期或者取年月日
- php 异常错误信息用处,关于PHP中异常错误的处理详细介绍
- 你应该知道的Windows复制技术
- unity模型任意无限切割插件
- 浅析C++开发工程师的高薪就业方向
- matlab符号运算实验,数学实验6--Matlab符号运算.pptx
- php5.3升级脚本
- Android office教程,Excel办公软件Office教程app
- 人脸检测高级:疲劳检测
- android log抓取工具,Android PC端用ADB抓取指定应用日志实现步骤
- 金蝶星空支持mysql吗_金蝶云星空K3 CLOUD SQL 数据库优化
- Windows应用程序未响应怎么办文件还没保存呢,是什么原因导致的应用程序未响应?
- IP签名档PHP源码,简单几步,教你制作自己的显IP签名档
- Java程序性能优化——设计优化
- PAT(甲级) 1003. Emergency
- 系综理论(Ensemble Theory)
- ubuntu16.04中安装Kdevelop和使用技巧