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 类。 |
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.