1
/****************************************************************************
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
7
** This file is part of the documentation of the Qt Toolkit.
9
** $QT_BEGIN_LICENSE:LGPL$
10
** No Commercial Usage
11
** This file contains pre-release code and may not be distributed.
12
** You may use this file in accordance with the terms and conditions
13
** contained in the Technology Preview License Agreement accompanying
16
** GNU Lesser General Public License Usage
17
** Alternatively, this file may be used under the terms of the GNU Lesser
18
** General Public License version 2.1 as published by the Free Software
19
** Foundation and appearing in the file LICENSE.LGPL included in the
20
** packaging of this file. Please review the following information to
21
** ensure the GNU Lesser General Public License version 2.1 requirements
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
** In addition, as a special exception, Nokia gives you certain additional
25
** rights. These rights are described in the Nokia Qt LGPL Exception
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
40
****************************************************************************/
44
\title The Arthur Paint System
46
\contentspage {What's New in Qt 4}{Home}
47
\previouspage The Interview Framework
48
\nextpage The Scribe Classes
50
This document describes Qt 4's painting system, providing a
51
comparison between the approaches used by Qt when rendering
52
graphics in Qt 3 and Qt 4.
56
\section1 Architecture
58
The Qt 4 Paint System is primarily based on the classes
59
QPainter, QPaintDevice, and QPaintEngine. QPainter is the
60
class used to perform drawing operations, such as drawLine()
61
and drawRect(). QPaintDevice represents a device that can be
62
painted on using a QPainter; both QWidget and QPixmap are
63
QPaintDevices. QPaintEngine provides the interface that the
64
painter uses to draw onto different types of devices.
66
\section2 A Look Back at Qt 3
68
In Qt 3, QPainter could be used to draw on widgets and pixmaps.
69
(It could also be used to draw to printers on Windows and Mac OS
70
X.) When other paint devices needed to be supported, such as
71
QPrinter on X11, this was done by deriving from QPaintDevice and
72
reimplementing the virtual function QPaintDevice::cmd(). A
73
reimplemented paint device was treated as an external device.
75
QPainter was capable of recognizing external devices and could
76
serialize each paint operation to the reimplemented cmd()
77
function. This allowed reimplementation of arbitrary devices, but
78
the approach has some disadvantages which we have addressed in
79
Qt 4. One of these is that an external device could not reuse any
80
functionality implemented in QPainter since QPainter was tied to
81
widget/pixmap painting on that platform. Supporting multiple
82
device backends, such as OpenGL, was therefore inconvenient and
85
This has led us to devise a more convenient and intuitive API for
88
\section2 How Painting is Done in Qt 4
90
In Qt 4 we have introduced the QPaintEngine abstract class.
91
Implementations of this class provide the concrete functionality
92
needed to draw to specific device types. The QPaintEngine class
93
is only used internally by QPainter and QPaintDevice, and it is
94
hidden from application programmers unless they reimplement their own
95
device types for their own QPaintEngine subclasses. Qt currently
96
provides paint engines for the following platforms and APIs:
99
\o A pixel-based engine for the Windows platform that is
100
also used to draw onto QImages on all platforms
101
\o OpenGL on all platforms
102
\o PostScript on Linux, Unix, and Mac OS X
103
\o QuickDraw and CoreGraphics on Mac OS X
104
\o X11 and the X Render Extension on Linux and Unix systems
106
\o QVFb, VNC, and LinuxFb for Qt for Embedded Linux
110
To implement support for a new backend, you must derive from
111
QPaintEngine and reimplement its virtual functions. You also need
112
to derive from QPaintDevice and reimplement the virtual function
113
QPaintDevice::paintEngine() to tell QPainter which paint engine
114
should be used to draw on this particular device.
116
The main benefit of this approach is that all painting follows the
117
same painting pipeline. This means that adding support for new features
118
and providing default implementations for unsupported ones has
121
\section1 New Features in the Qt 4 Paint System
123
\section2 Gradient Brushes
125
With Qt 4 it is possible to fill shapes using gradient
126
brushes. A gradient in this case is used to describe the transition
127
from one color at a given point to different color at another point. A
128
gradient can span from one color to another or over a
129
number of colors by specifying multiple colors at positions in the
130
gradient area. Qt 4 supports linear, radial, and conical gradients.
132
Linear gradients are specified using two control points.
133
Setting a linear gradient brush is done by creating a QLinearGradient
134
object and setting it as a brush.
136
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 0
138
The code shown above produces a pattern as show in the following
141
\img diagonalGradient.png
143
Radial gradients are specified using a center, a radius, and a
144
focal point. Setting a radial brush is done by creating a QRadialGradient
145
object and setting it as a brush.
147
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 1
149
The code shown above produces a pattern as shown in the following
152
\img radialGradient.png
154
Conical gradients are specified using a center and a start
155
angle. Setting a conical brush is done by creating a
156
QConicalGradient object and setting it as a brush.
158
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 2
160
The code shown above produces a pattern as shown in the following
163
\img conicalGradient.png
165
\section2 Alpha-Blended Drawing
167
With Qt 4 we support alpha-blended outlining and filling. The
168
alpha channel of a color is defined through QColor. The alpha
169
channel specifies the transparency effect, 0 represents a fully
170
transparent color, while 255 represents a fully opaque color. For
173
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 3
175
The code shown above produces the following output:
179
Alpha-blended drawing is supported on Windows, Mac OS X, and on
180
X11 systems that have the X Render extension installed.
183
\section2 QPainter and QGLWidget
185
It is now possible to open a QPainter on a QGLWidget as if it
186
were a normal QWidget. One huge benefit from this is that we
187
utilize the high performance of OpenGL for most drawing
188
operations, such as transformations and pixmap drawing.
191
\section2 Anti-Aliased Edges
193
On platforms where this is supported by the native drawing API, we
194
provide the option of turning on anti-aliased edges when drawing
197
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 4
199
This produces the following output:
203
Anti-aliasing is supported when drawing to a QImage and on all
204
systems, except on X11 when XRender is not present.
207
\section2 Extensive Use of Native Graphics Operations
209
Where this makes sense, Qt uses native graphics
210
operations. The benefit we gain from this is that these operations
211
can potentially be performed in hardware, giving significant
212
speed improvements over many pure-software implementations.
214
Among these are native transformations (Mac OS X and OpenGL),
215
making painting with a world matrix much faster. Some pixmap
216
operations have also been moved closer to the underlying
217
hardware implementations.
220
\section2 Painter Paths
222
A painter path is an object composed of a number of graphical
223
building blocks, such as rectangles, ellipses, lines, and curves.
224
A painter path can be used for filling, outlining, and for clipping.
225
The main advantage of painter paths over normal drawing operations
226
is that it is possible to build up non-linear shapes which can be
227
drawn later in one go.
229
Building blocks can be joined in closed subpaths, such as a
230
rectangle or an ellipse, or they can exist independently as unclosed
231
subpaths, although an unclosed path will not be filled.
233
Below is a code example on how a path can be used. The
234
painter in this case has a pen width of 3 and a light blue brush. We
235
first add a rectangle, which becomes a closed subpath. We then add
236
two bezier curves, and finally draw the entire path.
238
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 5
240
The code above produces the following output:
245
\section2 Widget Double-Buffering
247
In Qt 4, all widgets are double-buffered by default.
249
In previous versions of Qt double-buffering was achieved by
250
painting to an off-screen pixmap then copying the pixmap to the
253
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 6
255
Since the double-buffering is handled by QWidget internally this
258
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 7
260
Double-buffering is turned on by default, but can be turned off for
261
individual widgets by setting the widget attribute
262
Qt::WA_PaintOnScreen.
264
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 8
266
\section2 Pen and Brush Transformation
268
In Qt 3, pens and brushes weren't affected by the painter's
269
transformation matrix. For example, if you drew a rectangle with a
270
pen width of 1 using a scaled painter, the resulting line width
271
would still be 1. This made it difficult to implement features
272
such as zooming and high-resolution printing.
274
In Qt 4, pens and brushes honor the painter's transformation
277
Note that this feature is still in development and not yet
278
supported on all platforms.
280
\section2 Custom Filled Pens
282
In Qt 4, it is possible to specify how an outline should be
283
filled. It can be a solid color or a QBrush, which makes it
284
possible to specify both texture and gradient fills for both
287
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 9
289
The code above produces the following output:
291
\img gradientText.png
293
\section2 QImage as a Paint Device
295
A great improvement of Qt 4 over previous versions it that it now
296
provides a pixel-based raster paint engine which allows users to
297
open a painter on a QImage. The QImage paint engine supports the
298
full feature set of QPainter (paths, antialiasing, alphablending,
299
etc.) and can be used on all platforms.
301
One advantage of this is that it is possible to guarantee the
302
pixel exactness of any drawing operation in a platform-independent
305
Painting on an image is as simple as drawing on any other paint device.
307
\snippet doc/src/snippets/code/doc_src_qt4-arthur.qdoc 10
309
\section2 SVG Rendering Support
311
\l{Scalable Vector Graphics} (SVG) is an language for describing both static
312
and animated two-dimensional vector graphics. Qt includes support for the
313
\l{SVG 1.2 Tiny Static Features}{static features} of \l{SVG 1.2 Tiny}, taking
314
advantage of the improved paint system in Qt 4. SVG drawings can be rendered
315
onto any QPaintDevice subclass, such as QWidget, QImage, and QGLWidget, to
316
take advantage of specific advantages of each device. This approach gives
317
developers the flexibility to experiment, in order to find the best solution
318
for each application.
322
Since SVG is an XML-based format, the QtXml module is required to read SVG
323
files. For this reason, classes for SVG handling are provided separately in
326
Displaying an SVG drawing in an application is as simple as displaying a
327
bitmap image. QSvgWidget is a display widget that can be placed in an
328
appropriate place in a user interface, and new content can be loaded as
329
required. For example, a predetermined file can be loaded and displayed in
330
a widget with little effort:
332
\snippet doc/src/snippets/qsvgwidget/main.cpp 0
334
For applications with more specialized requirements, the QSvgRenderer class
335
provides more control over the way SVG drawings are rendered and animated.