1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Free Documentation License
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of this
** file.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\group printing
\title Printer and Printing APIs
\brief Classes for producing printed output
\ingroup groups
*/
/*!
\page printing.html
\title Printing with Qt
\ingroup qt-graphics
\previouspage Styling
\contentspage The Paint System
\brief A guide to producing printed output with Qt's paint system and widgets.
Qt provides extensive cross-platform support for printing. Using the printing
systems on each platform, Qt applications can print to attached printers and
across networks to remote printers. Qt's printing system also enables PostScript
and PDF files to be generated, providing the foundation for basic report
generation facilities.
\tableofcontents
\section1 Classes Supporting Printing
The following classes support the selecting and setting up of printers and
printing output.
\annotatedlist printing
\section1 Paint Devices and Printing
In Qt, printers are represented by QPrinter, a paint device that provides
functionality specific to printing, such as support for multiple pages and
double-sided output. As a result, printing involves using a QPainter to paint
onto a series of pages in the same way that you would paint onto a custom
widget or image.
\section2 Creating a QPrinter
Although QPrinter objects can be constructed and set up without requiring user
input, printing is often performed as a result of a request by the user;
for example, when the user selects the \gui{File|Print...} menu item in a GUI
application. In such cases, a newly-constructed QPrinter object is supplied to
a QPrintDialog, allowing the user to specify the printer to use, paper size, and
other printing properties.
\snippet examples/richtext/orderform/mainwindow.cpp 18
It is also possible to set certain default properties by modifying the QPrinter
before it is supplied to the print dialog. For example, applications that
generate batches of reports for printing may set up the QPrinter to
\l{QPrinter::setOutputFileName()}{write to a local file} by default rather than
to a printer.
\section2 Painting onto a Page
Once a QPrinter object has been constructed and set up, a QPainter can be used
to perform painting operations on it. We can construct and set up a painter in
the following way:
\snippet doc/src/snippets/printing-qprinter/object.cpp 0
Since the QPrinter starts with a blank page, we only need to call the
\l{QPrinter::}{newPage()} function after drawing each page, except for the
last page.
The document is sent to the printer, or written to a local file, when we call
\l{QPainter::}{end()}.
\section2 Coordinate Systems
QPrinter provides functions that can be used to obtain information about the
dimensions of the paper (the paper rectangle) and the dimensions of the
printable area (the page rectangle). These are given in logical device
coordinates that may differ from the physical coordinates used by the device
itself, indicating that the printer is able to render text and graphics at a
(typically higher) resolution than the user's display.
Although we do not need to handle the conversion between logical and physical
coordinates ourselves, we still need to apply transformations to painting
operations because the pixel measurements used to draw on screen are often
too small for the higher resolutions of typical printers.
\table
\row \o \bold{Printer and Painter Coordinate Systems}
The \l{QPrinter::}{paperRect()} and \l{QPrinter::}{pageRect()} functions
provide information about the size of the paper used for printing and the
area on it that can be painted on.
The rectangle returned by \l{QPrinter::}{pageRect()} usually lies inside
the rectangle returned by \l{QPrinter::}{paperRect()}. You do not need to
take the positions and sizes of these area into account when using a QPainter
with a QPrinter as the underlying paint device; the origin of the painter's
coordinate system will coincide with the top-left corner of the page
rectangle, and painting operations will be clipped to the bounds of the
drawable part of the page.
\o \inlineimage printer-rects.png
\endtable
The paint system automatically uses the correct device metrics when painting
text but, if you need to position text using information obtained from
font metrics, you need to ensure that the print device is specified when
you construct QFontMetrics and QFontMetricsF objects, or ensure that each QFont
used is constructed using the form of the constructor that accepts a
QPaintDevice argument.
\section1 Printing Widgets
To print a widget, you can use the QWidget::render() function. As mentioned,
the printer's resolution is usually higher than the screen resolution, so you
will have to scale the painter. You may also want to position the widget on the
page. The following code sample shows how this may look.
\snippet doc/src/snippets/widgetprinting.cpp 0
This will center the widget on the page and scale it so that it fits the page.
\section1 Printing from Complex Widgets
Certain widgets, such as QTextEdit and QGraphicsView, display rich content
that is typically managed by instances of other classes, such as QTextDocument
and QGraphicsScene. As a result, it is these content handling classes that
usually provide printing functionality, either via a function that can be used
to perform the complete task, or via a function that accepts an existing
QPainter object. Some widgets provide convenience functions to expose underlying
printing features, avoiding the need to obtain the content handler just to call
a single function.
The following table shows which class and function are responsible for
printing from a selection of different widgets. For widgets that do not expose
printing functionality directly, the content handling classes containing this
functionality can be obtained via a function in the corresponding widget's API.
\table
\header \o Widget \o Printing function \o Accepts
\row \o QGraphicsView \o QGraphicsView::render() \o QPainter
\row \o QSvgWidget \o QSvgRenderer::render() \o QPainter
\row \o QTextEdit \o QTextDocument::print() \o QPrinter
\row \o QTextLayout \o QTextLayout::draw() \o QPainter
\row \o QTextLine \o QTextLine::draw() \o QPainter
\endtable
QTextEdit requires a QPrinter rather than a QPainter because it uses information
about the configured page dimensions in order to insert page breaks at the most
appropriate places in printed documents.
*/
/*!
\page pdf-licensing.html
\title Notes about PDF Licensing
\ingroup licensing
\brief Details of restrictions on the use of PDF-related trademarks.
Please note that Adobe\reg places restrictions on the use of its trademarks
(including logos) in conjunction with PDF; e.g. "Adobe PDF". Please refer
to \l{http://www.adobe.com}{www.adobe.com} for guidelines.
*/
|