描绘设备和后端

Creating a Paint Device

The QPaintDevice class is the base class of objects that can be painted, i.e. QPainter can draw on any QPaintDevice 子类。 QPaintDevice 's drawing capabilities are currently implemented by the QWidget , QImage , QPixmap , QGLWidget , QGLPixelBuffer , QPicture and QPrinter 子类。

Widget

The QWidget class is the base class of all user interface objects. The widget is the atom of the user interface: it receives mouse, keyboard and other events from the window system, and paints a representation of itself on the screen.

图像

The QImage class provides a hardware-independent image representation which is designed and optimized for I/O, and for direct pixel access and manipulation. QImage supports several image formats including monochrome, 8-bit, 32-bit and alpha-blended images.

One advantage of using QImage as a paint device is that it is possible to guarantee the pixel exactness of any drawing operation in a platform-independent way. Another benefit is that the painting can be performed in another thread than the current GUI thread.

Pixmap

The QPixmap class is an off-screen image representation which is designed and optimized for showing images on screen. Unlike QImage , the pixel data in a pixmap is internal and is managed by the underlying window system, i.e. pixels can only be accessed through QPainter 函数或通过转换 QPixmap QImage .

To optimize drawing with QPixmap , Qt provides the QPixmapCache class which can be used to store temporary pixmaps that are expensive to generate without using more storage space than the cache limit.

Qt also provides the QBitmap convenience class, inheriting QPixmap . QBitmap guarantees monochrome (1-bit depth) pixmaps, and is mainly used for creating custom QCursor and QBrush 对象,构造 QRegion 对象,及为像素图和 Widget 设置遮罩。

OpenGL Widget

As mentioned previously, Qt provides the QtOpenGL module offering classes that makes it easy to use OpenGL in Qt applications. For example, the QGLWidget 启用 OpenGL API for rendering.

But QGLWidget is also a QWidget subclass, and can be used by QPainter as any other paint device. One huge benefit from this is that it enables Qt to utilize the high performance of OpenGL for most drawing operations, such as transformations and pixmap drawing.

Pixel Buffer

The QtOpenGL module also provides the QGLPixelBuffer class which inherits QPaintDevice 直接。

QGLPixelBuffer encapsulates an OpenGL pbuffer. Rendering into a pbuffer is normally done using full hardware acceleration which can be significantly faster than rendering into a QPixmap .

Framebuffer Object

The QtOpenGL module also provides the QGLFramebufferObject class which inherits QPaintDevice 直接。

QGLFramebufferObject encapsulates an OpenGL framebuffer object. Framebuffer objects can also be used for off-screen rendering, and offer several advantages over pixel buffers for this purpose. These are described in the QGLFramebufferObject 类文档编制。

Picture

The QPicture 类是描绘设备,它记录并重演 QPainter commands. A picture serializes painter commands to an IO device in a platform-independent format. QPicture is also resolution independent, i.e. a QPicture can be displayed on different devices (for example svg, pdf, ps, printer and screen) looking the same.

Qt 提供 QPicture::load () 和 QPicture::save () functions as well as streaming operators for loading and saving pictures.

Printer

The QPrinter class is a paint device that paints on a printer. On Windows or Mac OS X, QPrinter uses the built-in printer drivers. On X11, QPrinter generates postscript and sends that to lpr, lp, or another print program. QPrinter can also print to any other QPrintEngine 对象。

The QPrintEngine class defines an interface for how QPrinter interacts with a given printing subsystem. The common case when creating your own print engine, is to derive from both QPaintEngine and QPrintEngine .

The output format is by default determined by the platform the printer is running on, but by explicitly setting the output format to QPrinter::PdfFormat , QPrinter will generate its output as a PDF file.

Custom Backends

Support for a new backend can be implemented by deriving from the QPaintDevice class and reimplementing the virtual QPaintDevice::paintEngine () 函数以告诉 QPainter which paint engine should be used to draw on this particular device. To actually be able to draw on the device, this paint engine must be a custom paint engine created by deriving from the QPaintEngine 类。

Selecting the Painting Backend

Since Qt 4.5, it is possible to replace the paint engines and paint devices used for widgets, pixmaps and the offscreen double buffer. By default the backends are:

Windows Software Rasterizer
X11 X11
Mac OS X CoreGraphics
嵌入式 Software Rasterizer

Passing a command line parameter to the application, such as, -graphicssystem raster , specifies that Qt should use the software rasterizer for this application. The Software rasterizer is fully supported on all platforms.

> analogclock -graphicssystem raster
														

There is also a -graphicssystem opengl mode that uses OpenGL for all drawing. Currently, this engine is experimental as it does not draw everything correctly.

Qt also supports being configured using -graphicssystem raster|opengl in which case all applications will use the specified graphics system for its graphics.