创建绘制设备
QPaintDevice是能够被绘制类的基类。也就是说,QPainter可以在任何QPaintDevice的子类上绘制。目前已经实现了QPaintDevice绘画功能的类如下:QWidget, QImage, QPixmap, QGLWidget, QGLPixelBuffer, QPicture and QPrinter 的子类。
![绘画设备和后端(Paint Devices and Backends)_第1张图片](http://img.e-com-net.com/image/info5/a8c2afca481f4926a6769da1a080a4f1.jpg)
Widget
QWidget是所有用户界面类的基类,它实现了用户界面类的核心功能,包括:从窗口系统接收鼠标、键盘和其他事件,并且在屏幕上绘制自己;
Image
QImage提供了一种独立于硬件的图像显示方法,此方法优化了I/O操作,同时可直接访问和管理像素单元。QImage支持几种图像格式,包括monochrome(单色),8-bit,32-bit和alpha混合通道的图像格式。
使用QImage作为绘图设备的一个优点,程序员可以使用平台独立的方法,保证能够精确的操作图像像素。另一个优点使用户在独立于当前GUI线程的其他线程中执行绘制操作。
Pixmap
QPixmap实现了离屏图像的显示方法,它对要显示在屏幕上的图像进行优化。和QImage不同,在pixmap上的像素数据是它内部特有的,并且这些数像素数据由底层窗口系统管理,也就是说,像素数据只能通过QPainter的成员函数来访问,或者将QPixmap转换为QImage后访问。
为了优化QPixmap的绘图效率,Qt提供QPixmapCache类存储临时pixmaps,如果操作系统存储空间不够cache所需大小,使用这种方式的代价反而更昂贵。
Qt提供QBitmap类,它继承自QPixmap,QBitmap适合单色(1比特色深)图像,主要用于创建自定义QCursor和QBrush对象,构造QRegion对象,设置pixmaps和widgets的屏蔽标志。
OpenGL Widget
如前所述,Qt提供QtOpenGL模块方便用户在Qt应用程序中调用OpenGL绘图。例如,QGLWidget调用OpenGL API显示。
同时,QGLWidget也是QWidget的子类,就像其他可用来绘制的设备一样可被QPainter绘制。使用QGLWidget的最大好处,程序员可以利用OpenGL进行高效绘制,例如图像转换和pixmap绘制。
Pixel Buffer
QtOpenGL模块提供QGLPixelBuffer类,它直接继承自QpaintDevice。
QGLPixelBuffer封装一个OpenGL pbuffer。充分利用硬件加速将图像显示到一个pbuffer中,相比绘制到QPixmap中,这种方式的绘制效率提升很大。
Framebuffer Object
QtOpenGL模块还提供QGLFramebufferObject类,直接从QPaintDevice继承。
QGLFramebufferObject封装了一个OpenGL framebuffer对象。Framebuffer对象能用于离屏绘制,基于这种特性,还提供了方便像素缓存区的操作,具体功能请查看QGLFramebufferObject API文档。
Picture
作为绘图设备,QPicture类记录和保存QPainter的绘制操作。一个图像使用平台独立的格式将绘制命令序列化到IO设备上执行。QPicture也是一种独立的解决方案,它能在不同的设备上显示出相同的效果(例如在svg, pdf, ps, 打印机和屏幕)。
为加载和保存图片,Qt提供了QPicture::load()和QPicture::save()函数以及流操作。
Printer
QPrinter是一个用来在printer上绘制的绘图设备。Windows和Mac OS X上,QPrinter使用内建打印设备。X11上,QPrinter产生postscript脚本并发送到lpr, lp或者其他打印程序。QPrinter也能打印到任何QPrintEngine对象上。
对于QPrinter如何和一个给定的打印子系统交互,QPrintEngine定义了这样的一个接口。当创建自定义的打印引擎时,通常情况是同时从QPaintEngine和QPrintEngine派生。
输出格式默认由printer运行的平台决定,如果显示设置输出格式为QPrinter::PdfFormat,QPrinter将输出为PDF文件。
Custom Backends(自定义后端)
对新后端的支持,可以从QPaintDevice衍生新的类,重新实现虚拟函数QPaintDevice::paintEngine(),告知应该用哪个引擎在某个设备上绘制。为了能够在某设备上正确绘制,此绘图引擎必须是一个从QPaintEngine衍生的自定义引擎。
Selecting the Painting Backend(选择绘制后端)
从Qt4.5开始,我们可以替换widgets,pixmaps和离线双缓冲的绘图引擎和绘图设备。默认后端如下:
Windows Software Rasterizer
X11 X11
Mac OS X CoreGraphics
Embedded Software Rasterizer
如果应用程序使用软件光栅化效果显示,可传递命令行参数到应用程序,例如: -graphicssystem raster。软件光栅化效果在所有平台上都支持。
analogclock -graphicssystem raster
使用OpenGL模式绘制,可使用 -graphicssystem opengl。此种绘图模式的引擎还无法正确绘制所有的元素,目前尚处于实验阶段。Qt也支持配置参数 -graphicssystem raster|opengl,配置后,所有应用将使用参数指定的图形系统处理图形。