详细描述:

QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作。它可以画从简单的线到复杂的形状。通常情况下,QPainter的使用是在widget当中的painter事件使用。记得在执行完之后要及时销毁QPainter的对象。

  1. void SimpleExampleWidget::paintEvent(QPaintEvent *)
  2. {
  3. QPainter painter(this);
  4. painter.setPen(Qt::blue);
  5. painter.setFont(QFont("Arial", 30));
  6. painter.drawText(rect(), Qt::AlignCenter, "Qt");
  7. }
  1. 你可以使用painter不同的composition mode将图片结合在一起。
  1. 一个painter被通过begin()函数被激活并且使用一个QPainterDevice参数的构造函数进行构造,调用end()函数和析构函数解除
  1. 激活。
  1. 结合QPaintDeviceQPaintEngine,我们知道,QPainter执行的是一个画图的操作,QPaintDevice代表的是能被QPainter画上去
  1. 的设备。
  1. QPaintEngine提供接口使得QPainter能够画在不同类型的设备上。当painter被激活的时候,device()函数返回paint设备,paint
  1. Engine()返回一个当前painter正在绘制的engine
  1. 有时候在一个特殊的QPaintDevice上绘制也是可取的,QPainter提供了这样的函数setRedirected()来做这件事。
  1. 当被绘制的设备是一个widget的时候,QPainter只能在paintEvent()函数中或者被该函数调用的函数当中使用,除非Qt::WA_Paint
  1. OutsidePaintEvent 这个widget属性被设置。而在mac osx或者windows当中,无论该属性有没有设置,painter都必须在paint
  1. Event()函数当中使用。
  1.  
  1. Settings
  1. QPainter有许多的设置可以用来满足你的个人偏爱。
  1. font():字体设置。
  1. brush():画刷设置,定义颜色或者模式(pattern)来填充形状。
  1. pen():定义颜色和点描来绘制线或者边框。
  1. backgroundMode():来表示是否有一个background()函数。
  1. background(): 只在backgroundMode()为Qt::OpaqueMode pen()是点描的时候有效。
  1. brushOrigin():定义使用的刷子的来源,通常与widget的背景保持一致。
  1. viewport(),window(),worldTransform()用来转换坐标变换。
  1. hasClipping():表示painter是否绑定在某个设备上,该设备也被绑定。
  1. layoutDirection():当绘制文本的时候定义布局方向。
  1. worldMatrixEnable(),viewTransformEnable()描述转换坐标是否允许。
  1. 我们可以随时使用save()函数来保存QPainter的状态,并且用restore()函数来使他们回退。
  1.  
  1. Drawing
  1. drawPoint(),drawPoints(), drawLine(), drawRect(), drawRoundedRect(),drawEllipse(), drawArc(), drawPie(), 
  1. drawChord(), drawPolyline(),drawPolygon(), drawConvexPolygon()  drawCubicBezier().
  1. QPainter类也提供了fillRect()函数用来调用QBrush填充提供的QRect
  1. 如果你需要画一些很复杂的图形,或者需要做一些重复性的工作,可以考虑建立一个QPainterPath并且使用drawPath()来调用。
  1. QPainter也提供了fillPath()和stokePath来绘制外形。
  1. QPainterPath上使用矢量绘图技术,可以做出许多特殊的图形,也可以使用自定义的patterns来绘制自己的图形。
  1. ~有许多的函数可以用来画图(pixmaps/images),我们称之为drawPixmap(),drawImage()和drawTiledPixmap()。
  1. drawText()绘制文本,drawPicture()会忽视所有的painter设置,而使用picture自己的设置。
  1.  
  1. Rendering Quality渲染质量
  1. 使用QPainter能够优化渲染结果,QPainter::Antialiasing用来反锯齿等。
  1.  
  1. Coordinate Transformations坐标转换
  1. 最常用的坐标转换有放大缩小,旋转,剪切,移动等,scale(),rotate(),translate(),shear()函数。
  1.  
  1. Compositon Mode复合方式
  1. 一个像素覆盖在另外一个像素上面的时候的复合方式。常用的两个复合方式是SourceSourceOver,前者用于在设备上绘制不透明的对象,
  1. 后者来说,源是透明的并且画在目标像素之上。
  1. 注意到复合转换在于对像素的聪明操作,在图像上和图像矩形范围内就有了区别,在矩形边框上的像素alpha=0的话,这些像素就会覆盖在其
  1. 他图像的像素之上。
  1.  
  1. Limitations
  1. qt基于光栅的坐标系,+/-(2^15)能用。应为用于表示坐标长的是的short int类型。
  1. 当用qtstoker生成的弯曲曲线的外形时,仅仅是一种近似。
  1.  
  1. Performance
  1. QPainter是一个丰富的框架,允许开发者做许许多多的图像操作,比如倾斜度,复合模式,矢量绘图等,并且QPainter能够这样子在许多的
  1. 不相同的硬件和软件栈之上工作。自然的,软件和硬件的基本组合有许多对性能的影响。要使得在这一系列的组合当中所有的绘图操作都尽可
  1. 能的快几乎是不可能的,因为需要巨大的工作量,所以,折中的方式是我们选择了一些QPainter API和后端的子集,确保能够在给定的软硬件
  1. 组合上尽可能好的使用。
  1. 那些被我们所关注的高性能的引擎有:
  1. Raster:该后端在纯软件中实现了所有的渲染,也经常被用在QImages当中渲染,具有优化性能的包括 QImage::Format_ARGB32_Pre
  1. multiplied,QImage::Format_RGB32或者 QImage::Format_RGB16,其他的格式化,在性能上都会显著恶化。
  1. OpenGL 2.0ES):这是图像硬件加速的主要后端。他能够在支持OpenGL2.0或者OpenGL/ES2.0规范的设备当中或者桌面系统当运
  1. 行。该规范得到了最近几年大部分的图形芯片制造厂商的支持。引擎支持QGLWidget上使用QPainter或者输入在底层的系统中输入
  1. -graphicssystem opengl
  1. OpenVG:支持OpenVG引擎。
  1. 这些操作包括:简单的转换,移动,缩放,或者直角的旋转。
  1. drawPixmap():在软硬件组合上不透明的,飞光滑转换方式的简单变换。
  1. 矩形的实色填充,双色渐变和简单的线性变换。矩形的裁剪。像素组合方式。等
  1.  
  1. Menber Function Documentation(我挑几个重要的函数翻译)
  1. QPainter::QPainter()
  1. 构造函数。
  1. QPainter::QPainterQPainterDevice*device)
  1. 构造一个painter开始在设备上进行绘制。
  1. void MyWidget::paintEvent(QPaintEvent *)
  2. {
  3. QPainter p;
  4. p.begin(this);
  5. p.drawLine(...); // drawing code
  6. p.end();
  1. /*和QPainter p(this)相同。*/
  2. }
  1. bool QPainter::begin(QPaintDevice *device)
  1. 使用该函数时要注意以下情况:
  1. painter->begin(0); // 绘制设备不可能为0;
  2.  
  3. QPixmap image(0, 0);
  4. painter->begin(&image); // 图像为空,这句话错误
  5.  
  6. painter->begin(myWidget);
  7. painter2->begin(myWidget); //同一个时间内不能够出现两个painter对象。
  1. void QPainter::drawConvexPolygon(const QPointF *points,int pointCount)
  1. 绘制多边形函数。
  1. 在一些平台上,drawConvexPlygon()函数能够比drawPloygon()函数更加快速。
  1. void QPainter::drawEllipse(const QRectF&rectangle)
  1. 绘制椭圆。
  1. void QPainter::drawImage(const QRectF &target,const QImage &image,const QRectF &source,Qt::ImageConversion-
  1. Flag flags=Qt::AutoColor)
  1. 把矩形部分源的画画到目标的矩形之中。
  1. 该函数有许多不相同的构造函数,比如void QPainter::drawImage(const QRectF &rectangle,const QImage &image)
  1. 该函数图片会知道所给的矩形当中,并且图片会自己缩放以满足矩形框的大小(除非额外设定)。
  1. 类似于上面的函数还有drawPixmap()。
  1. void QPainter::drawPoint();画点函数。void QPainter::drawRects()画矩形。void QPainter::drawText()画文本
  1.  
  1. 等等。将来在对Qt裁剪的过场当中,我们要对Qt深入的了解。QTdemo当中有非常棒的example可以学习。要学会看别人的代码。

http://blog.csdn.net/madao123/article/details/5938453

QPainter类学习的更多相关文章

  1. 【转】Date类学习总结(Calendar Date 字符串 相互转换 格式化)

    原文网址:http://www.blogjava.net/jerry-zhaoj/archive/2008/10/08/233228.html Date类学习总结 1.计算某一月份的最大天数 Cale ...

  2. System类学习笔记

    最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...

  3. Date类学习总结(Calendar Date 字符串 相互转换 格式化)

    Date类学习总结 1.计算某一月份的最大天数 Calendar time=Calendar.getInstance();time.clear();time.set(Calendar.YEAR,yea ...

  4. Scala中的类学习

    Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...

  5. zt C++ list 类学习笔记

    C++ list 类学习笔记 分类: C++ 2011-09-29 00:12 7819人阅读 评论(0) 收藏 举报 listc++iteratorvectorcconstructor 双向循环链表 ...

  6. Properties工具类学习

    Properties类学习 1.定义 Properties,java.utils包下的一个工具类,主要用于读取Java的配置文件.各种语言都有自己所支持的配置文件,配置文件中很多变量是经常变动的. 这 ...

  7. RandomAccessFile类学习

    RandomAccessFile类学习 RandomAccessFile是io包的类,从Object直接继承而来,只可以对文件进行操作,可以对文件进行读取和写入. 当模式为r:当文件不存在时会报异常: ...

  8. Task类学习教程—组合任务ContinueWith

    Task类学习教程-组合任务.ContinueWith 一.简介 通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.ContinueWith是Task根据其自身状况,决定后续应该作何操作 ...

  9. GUI学习之五——QAbstractButton类学习笔记

    今天总结一下AbstractButton类的学习笔记. 一.描述 AbstractButton是对各种按键的抽象类他的继承关系是这样的 首先,QAbstractButton继承了QWidget类的各种 ...

随机推荐

  1. android注解使用详解(图文)

    在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家可以参考我的另一片文章Java注解详解.最近有时间研究了android注解的使用,今天与大家分享一下. android中 ...

  2. phpQuery轻松采集网页内容

    原文地址:phpQuery轻松采集网页内容作者:陌上花开 phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容,比如获取某新闻网站的头条信息.更有意思的是,它 ...

  3. (转)PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数

    一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...

  4. 线性布局LinearLayout和相对布局RelativeLayout 之间的比较

    LinearLayout和RelativeLayout之间: 共有属性:java代码中通过btn1关联次控件android:id="@+id/btn1" 控件宽度android:l ...

  5. “jni.h”: No such file or directory

    VS2010解决方案: 进入 “包含目录“ 方式: 右键项目属性页-> 配置属性->VC++目录->包含目录 在”包含目录“中编辑 添加以下路径: C:\Program Files\ ...

  6. [Twisted] Protocols协议和Protocol Factories 协议工厂

    Protocols 描述了如何异步处理网络事件.Twisted维护了许多协议的实现,如HTTP,Telent,DNS,IMAP.Portocols实现了IProtocol接口, IProtocol包含 ...

  7. 读懂IL代码(四)

    这一篇是IL系列的最后一篇的,主要是要说一下IL中的流程控制.我相信,经过前面三篇的介绍,看IL代码应该不是什么大问题了吧.好吧,闲话不多说了,就来简单的说一下吧. 还是跟前几篇一样,以例子来解释说明 ...

  8. 手机定位原理 - GPS/GLONASS/北斗 + WIFI + 基站

    卫星定位系统 - GPS/GLONASS/北斗: 关于GPS.GLONASS.北斗.伽利略系统的科普请自行谷歌. GPS是使用最广泛的全球定位网络,几乎是所有智能手机的标配.进几年,俄罗斯的GLONA ...

  9. ecshop---京东手机模板js的eval产生冲突的解决方法。

    今天弄ecshop手机模板的时候,发现首页的广告图出不来,js报错

  10. DOM 之 document 查找元素方法

    DOM 之 document 查找元素方法 getElementById("idName"); // 始终取得第一个 idName 的元素 getElementsByTagName ...