source: trunk/src/gui/painting/qprinter.cpp@ 564

Last change on this file since 564 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 66.0 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
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.
23**
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.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qprinter_p.h"
43#include "qprinter.h"
44#include "qprintengine.h"
45#include "qprinterinfo.h"
46#include "qlist.h"
47#include <qpagesetupdialog.h>
48#include <qapplication.h>
49#include <qfileinfo.h>
50#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
51#include "private/qcups_p.h"
52#endif
53
54#ifndef QT_NO_PRINTER
55
56#if defined (Q_WS_WIN)
57#include <private/qprintengine_win_p.h>
58#elif defined (Q_WS_MAC)
59#include <private/qprintengine_mac_p.h>
60#elif defined (QTOPIA_PRINTENGINE)
61#include <private/qprintengine_qws_p.h>
62#endif
63#include <private/qprintengine_ps_p.h>
64
65#if defined(Q_WS_X11)
66#include <private/qt_x11_p.h>
67#endif
68
69#ifndef QT_NO_PDF
70#include "qprintengine_pdf_p.h"
71#endif
72
73#include <qpicture.h>
74#include <private/qpaintengine_preview_p.h>
75
76#if defined(QT3_SUPPORT)
77# include "qprintdialog.h"
78#endif // QT3_SUPPORT
79
80QT_BEGIN_NAMESPACE
81
82#define ABORT_IF_ACTIVE(location) \
83 if (d->printEngine->printerState() == QPrinter::Active) { \
84 qWarning("%s: Cannot be changed while printer is active", location); \
85 return; \
86 }
87
88// NB! This table needs to be in sync with QPrinter::PaperSize
89static const float qt_paperSizes[][2] = {
90 {210, 297}, // A4
91 {176, 250}, // B5
92 {215.9f, 279.4f}, // Letter
93 {215.9f, 355.6f}, // Legal
94 {190.5f, 254}, // Executive
95 {841, 1189}, // A0
96 {594, 841}, // A1
97 {420, 594}, // A2
98 {297, 420}, // A3
99 {148, 210}, // A5
100 {105, 148}, // A6
101 {74, 105}, // A7
102 {52, 74}, // A8
103 {37, 52}, // A8
104 {1000, 1414}, // B0
105 {707, 1000}, // B1
106 {31, 44}, // B10
107 {500, 707}, // B2
108 {353, 500}, // B3
109 {250, 353}, // B4
110 {125, 176}, // B6
111 {88, 125}, // B7
112 {62, 88}, // B8
113 {33, 62}, // B9
114 {163, 229}, // C5E
115 {105, 241}, // US Common
116 {110, 220}, // DLE
117 {210, 330}, // Folio
118 {431.8f, 279.4f}, // Ledger
119 {279.4f, 431.8f} // Tabloid
120};
121
122/// return the multiplier of converting from the unit value to postscript-points.
123double qt_multiplierForUnit(QPrinter::Unit unit, int resolution)
124{
125 switch(unit) {
126 case QPrinter::Millimeter:
127 return 2.83464566929;
128 case QPrinter::Point:
129 return 1.0;
130 case QPrinter::Inch:
131 return 72.0;
132 case QPrinter::Pica:
133 return 12;
134 case QPrinter::Didot:
135 return 1.065826771;
136 case QPrinter::Cicero:
137 return 12.789921252;
138 case QPrinter::DevicePixel:
139 return 72.0/resolution;
140 }
141 return 1.0;
142}
143
144// not static: it's needed in qpagesetupdialog_unix.cpp
145QSizeF qt_printerPaperSize(QPrinter::Orientation orientation,
146 QPrinter::PaperSize paperSize,
147 QPrinter::Unit unit,
148 int resolution)
149{
150 int width_index = 0;
151 int height_index = 1;
152 if (orientation == QPrinter::Landscape) {
153 width_index = 1;
154 height_index = 0;
155 }
156 const qreal multiplier = qt_multiplierForUnit(unit, resolution);
157 return QSizeF((qt_paperSizes[paperSize][width_index] * 72 / 25.4) / multiplier,
158 (qt_paperSizes[paperSize][height_index] * 72 / 25.4) / multiplier);
159}
160
161
162// returns the actual num copies set on a printer, not
163// the number that is documented in QPrinter::numCopies()
164int qt_printerRealNumCopies(QPaintEngine *engine)
165{
166 int numCopies = 1;
167 if (engine->type() == QPaintEngine::PostScript
168 || engine->type() == QPaintEngine::Pdf)
169 {
170 QPdfBaseEngine *base = static_cast<QPdfBaseEngine *>(engine);
171 numCopies = base->d_func()->copies;
172 }
173#ifdef Q_WS_WIN
174 else if (engine->type() == QPaintEngine::Windows) {
175 QWin32PrintEngine *base = static_cast<QWin32PrintEngine *>(engine);
176 numCopies = base->d_func()->num_copies;
177 }
178#endif
179 return numCopies;
180}
181
182void QPrinterPrivate::createDefaultEngines()
183{
184 QPrinter::OutputFormat realOutputFormat = outputFormat;
185#if !defined (QTOPIA_PRINTENGINE)
186#if defined (Q_OS_UNIX) && ! defined (Q_WS_MAC)
187 if(outputFormat == QPrinter::NativeFormat) {
188 realOutputFormat = QPrinter::PostScriptFormat;
189 }
190#endif
191#endif
192
193 switch (realOutputFormat) {
194 case QPrinter::NativeFormat: {
195#if defined (Q_WS_WIN)
196 QWin32PrintEngine *winEngine = new QWin32PrintEngine(printerMode);
197 paintEngine = winEngine;
198 printEngine = winEngine;
199#elif defined (Q_WS_MAC)
200 QMacPrintEngine *macEngine = new QMacPrintEngine(printerMode);
201 paintEngine = macEngine;
202 printEngine = macEngine;
203#elif defined (QTOPIA_PRINTENGINE)
204 QtopiaPrintEngine *qwsEngine = new QtopiaPrintEngine(printerMode);
205 paintEngine = qwsEngine;
206 printEngine = qwsEngine;
207#elif defined (Q_OS_UNIX)
208 Q_ASSERT(false);
209#endif
210 }
211 break;
212 case QPrinter::PdfFormat: {
213 QPdfEngine *pdfEngine = new QPdfEngine(printerMode);
214 paintEngine = pdfEngine;
215 printEngine = pdfEngine;
216 }
217 break;
218 case QPrinter::PostScriptFormat: {
219 QPSPrintEngine *psEngine = new QPSPrintEngine(printerMode);
220 paintEngine = psEngine;
221 printEngine = psEngine;
222 }
223 break;
224 }
225 use_default_engine = true;
226 had_default_engines = true;
227}
228
229#ifndef QT_NO_PRINTPREVIEWWIDGET
230QList<const QPicture *> QPrinterPrivate::previewPages() const
231{
232 if (previewEngine)
233 return previewEngine->pages();
234 return QList<const QPicture *>();
235}
236
237void QPrinterPrivate::setPreviewMode(bool enable)
238{
239 Q_Q(QPrinter);
240 if (enable) {
241 if (!previewEngine)
242 previewEngine = new QPreviewPaintEngine;
243 had_default_engines = use_default_engine;
244 use_default_engine = false;
245 realPrintEngine = printEngine;
246 realPaintEngine = paintEngine;
247 q->setEngines(previewEngine, previewEngine);
248 previewEngine->setProxyEngines(realPrintEngine, realPaintEngine);
249 } else {
250 q->setEngines(realPrintEngine, realPaintEngine);
251 use_default_engine = had_default_engines;
252 }
253}
254#endif // QT_NO_PRINTPREVIEWWIDGET
255
256void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey key)
257{
258 for (int c = 0; c < manualSetList.size(); ++c) {
259 if (manualSetList[c] == key) return;
260 }
261 manualSetList.append(key);
262}
263
264
265/*!
266 \class QPrinter
267 \reentrant
268
269 \brief The QPrinter class is a paint device that paints on a printer.
270
271 \ingroup printing
272
273
274 This device represents a series of pages of printed output, and is
275 used in almost exactly the same way as other paint devices such as
276 QWidget and QPixmap.
277 A set of additional functions are provided to manage device-specific
278 features, such as orientation and resolution, and to step through
279 the pages in a document as it is generated.
280
281 When printing directly to a printer on Windows or Mac OS X, QPrinter uses
282 the built-in printer drivers. On X11, QPrinter uses the
283 \l{Common Unix Printing System (CUPS)} or the standard Unix \l lpr utility
284 to send PostScript or PDF output to the printer. As an alternative,
285 the printProgram() function can be used to specify the command or utility
286 to use instead of the system default.
287
288 Note that setting parameters like paper size and resolution on an
289 invalid printer is undefined. You can use QPrinter::isValid() to
290 verify this before changing any parameters.
291
292 QPrinter supports a number of parameters, most of which can be
293 changed by the end user through a \l{QPrintDialog}{print dialog}. In
294 general, QPrinter passes these functions onto the underlying QPrintEngine.
295
296 The most important parameters are:
297 \list
298 \i setOrientation() tells QPrinter which page orientation to use.
299 \i setPaperSize() tells QPrinter what paper size to expect from the
300 printer.
301 \i setResolution() tells QPrinter what resolution you wish the
302 printer to provide, in dots per inch (DPI).
303 \i setFullPage() tells QPrinter whether you want to deal with the
304 full page or just with the part the printer can draw on.
305 \i setNumCopies() tells QPrinter how many copies of the document
306 it should print.
307 \endlist
308
309 Many of these functions can only be called before the actual printing
310 begins (i.e., before QPainter::begin() is called). This usually makes
311 sense because, for example, it's not possible to change the number of
312 copies when you are halfway through printing. There are also some
313 settings that the user sets (through the printer dialog) and that
314 applications are expected to obey. See QAbstractPrintDialog's
315 documentation for more details.
316
317 When QPainter::begin() is called, the QPrinter it operates on is prepared for
318 a new page, enabling the QPainter to be used immediately to paint the first
319 page in a document. Once the first page has been painted, newPage() can be
320 called to request a new blank page to paint on, or QPainter::end() can be
321 called to finish printing. The second page and all following pages are
322 prepared using a call to newPage() before they are painted.
323
324 The first page in a document does not need to be preceded by a call to
325 newPage(). You only need to calling newPage() after QPainter::begin() if you
326 need to insert a blank page at the beginning of a printed document.
327 Similarly, calling newPage() after the last page in a document is painted will
328 result in a trailing blank page appended to the end of the printed document.
329
330 If you want to abort the print job, abort() will try its best to
331 stop printing. It may cancel the entire job or just part of it.
332
333 Since QPrinter can print to any QPrintEngine subclass, it is possible to
334 extend printing support to cover new types of printing subsystem by
335 subclassing QPrintEngine and reimplementing its interface.
336
337 \sa QPrintDialog, {Printing with Qt}
338*/
339
340/*!
341 \enum QPrinter::PrinterState
342
343 \value Idle
344 \value Active
345 \value Aborted
346 \value Error
347*/
348
349/*!
350 \enum QPrinter::PrinterMode
351
352 This enum describes the mode the printer should work in. It
353 basically presets a certain resolution and working mode.
354
355 \value ScreenResolution Sets the resolution of the print device to
356 the screen resolution. This has the big advantage that the results
357 obtained when painting on the printer will match more or less
358 exactly the visible output on the screen. It is the easiest to
359 use, as font metrics on the screen and on the printer are the
360 same. This is the default value. ScreenResolution will produce a
361 lower quality output than HighResolution and should only be used
362 for drafts.
363
364 \value PrinterResolution This value is deprecated. Is is
365 equivalent to ScreenResolution on Unix and HighResolution on
366 Windows and Mac. Due do the difference between ScreenResolution
367 and HighResolution, use of this value may lead to non-portable
368 printer code.
369
370 \value HighResolution On Windows, sets the printer resolution to that
371 defined for the printer in use. For PostScript printing, sets the
372 resolution of the PostScript driver to 1200 dpi.
373
374 \note When rendering text on a QPrinter device, it is important
375 to realize that the size of text, when specified in points, is
376 independent of the resolution specified for the device itself.
377 Therefore, it may be useful to specify the font size in pixels
378 when combining text with graphics to ensure that their relative
379 sizes are what you expect.
380*/
381
382/*!
383 \enum QPrinter::Orientation
384
385 This enum type (not to be confused with \c Orientation) is used
386 to specify each page's orientation.
387
388 \value Portrait the page's height is greater than its width.
389
390 \value Landscape the page's width is greater than its height.
391
392 This type interacts with \l QPrinter::PaperSize and
393 QPrinter::setFullPage() to determine the final size of the page
394 available to the application.
395*/
396
397
398/*!
399 \enum QPrinter::PrintRange
400
401 Used to specify the print range selection option.
402
403 \value AllPages All pages should be printed.
404 \value Selection Only the selection should be printed.
405 \value PageRange The specified page range should be printed.
406
407 \sa QAbstractPrintDialog::PrintRange
408*/
409
410/*!
411 \enum QPrinter::PrinterOption
412 \compat
413
414 Use QAbstractPrintDialog::PrintDialogOption instead.
415
416 \value PrintToFile
417 \value PrintSelection
418 \value PrintPageRange
419*/
420
421/*!
422 \enum QPrinter::PageSize
423
424 \obsolete
425 Use QPrinter::PaperSize instead.
426
427 \value A0 841 x 1189 mm
428 \value A1 594 x 841 mm
429 \value A2 420 x 594 mm
430 \value A3 297 x 420 mm
431 \value A4 210 x 297 mm, 8.26 x 11.69 inches
432 \value A5 148 x 210 mm
433 \value A6 105 x 148 mm
434 \value A7 74 x 105 mm
435 \value A8 52 x 74 mm
436 \value A9 37 x 52 mm
437 \value B0 1030 x 1456 mm
438 \value B1 728 x 1030 mm
439 \value B10 32 x 45 mm
440 \value B2 515 x 728 mm
441 \value B3 364 x 515 mm
442 \value B4 257 x 364 mm
443 \value B5 182 x 257 mm, 7.17 x 10.13 inches
444 \value B6 128 x 182 mm
445 \value B7 91 x 128 mm
446 \value B8 64 x 91 mm
447 \value B9 45 x 64 mm
448 \value C5E 163 x 229 mm
449 \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope
450 \value DLE 110 x 220 mm
451 \value Executive 7.5 x 10 inches, 191 x 254 mm
452 \value Folio 210 x 330 mm
453 \value Ledger 432 x 279 mm
454 \value Legal 8.5 x 14 inches, 216 x 356 mm
455 \value Letter 8.5 x 11 inches, 216 x 279 mm
456 \value Tabloid 279 x 432 mm
457 \value Custom Unknown, or a user defined size.
458
459 \omitvalue NPageSize
460 */
461
462/*!
463 \enum QPrinter::PaperSize
464 \since 4.4
465
466 This enum type specifies what paper size QPrinter should use.
467 QPrinter does not check that the paper size is available; it just
468 uses this information, together with QPrinter::Orientation and
469 QPrinter::setFullPage(), to determine the printable area.
470
471 The defined sizes (with setFullPage(true)) are:
472
473 \value A0 841 x 1189 mm
474 \value A1 594 x 841 mm
475 \value A2 420 x 594 mm
476 \value A3 297 x 420 mm
477 \value A4 210 x 297 mm, 8.26 x 11.69 inches
478 \value A5 148 x 210 mm
479 \value A6 105 x 148 mm
480 \value A7 74 x 105 mm
481 \value A8 52 x 74 mm
482 \value A9 37 x 52 mm
483 \value B0 1000 x 1414 mm
484 \value B1 707 x 1000 mm
485 \value B2 500 x 707 mm
486 \value B3 353 x 500 mm
487 \value B4 250 x 353 mm
488 \value B5 176 x 250 mm, 6.93 x 9.84 inches
489 \value B6 125 x 176 mm
490 \value B7 88 x 125 mm
491 \value B8 62 x 88 mm
492 \value B9 33 x 62 mm
493 \value B10 31 x 44 mm
494 \value C5E 163 x 229 mm
495 \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope
496 \value DLE 110 x 220 mm
497 \value Executive 7.5 x 10 inches, 190.5 x 254 mm
498 \value Folio 210 x 330 mm
499 \value Ledger 431.8 x 279.4 mm
500 \value Legal 8.5 x 14 inches, 215.9 x 355.6 mm
501 \value Letter 8.5 x 11 inches, 215.9 x 279.4 mm
502 \value Tabloid 279.4 x 431.8 mm
503 \value Custom Unknown, or a user defined size.
504
505 With setFullPage(false) (the default), the metrics will be a bit
506 smaller; how much depends on the printer in use.
507
508 \omitvalue NPageSize
509 \omitvalue NPaperSize
510*/
511
512
513/*!
514 \enum QPrinter::PageOrder
515
516 This enum type is used by QPrinter to tell the application program
517 how to print.
518
519 \value FirstPageFirst the lowest-numbered page should be printed
520 first.
521
522 \value LastPageFirst the highest-numbered page should be printed
523 first.
524*/
525
526/*!
527 \enum QPrinter::ColorMode
528
529 This enum type is used to indicate whether QPrinter should print
530 in color or not.
531
532 \value Color print in color if available, otherwise in grayscale.
533
534 \value GrayScale print in grayscale, even on color printers.
535*/
536
537/*!
538 \enum QPrinter::PaperSource
539
540 This enum type specifies what paper source QPrinter is to use.
541 QPrinter does not check that the paper source is available; it
542 just uses this information to try and set the paper source.
543 Whether it will set the paper source depends on whether the
544 printer has that particular source.
545
546 \warning This is currently only implemented for Windows.
547
548 \value Auto
549 \value Cassette
550 \value Envelope
551 \value EnvelopeManual
552 \value FormSource
553 \value LargeCapacity
554 \value LargeFormat
555 \value Lower
556 \value MaxPageSource
557 \value Middle
558 \value Manual
559 \value OnlyOne
560 \value Tractor
561 \value SmallFormat
562*/
563
564/*!
565 \enum QPrinter::Unit
566 \since 4.4
567
568 This enum type is used to specify the measurement unit for page and
569 paper sizes.
570
571 \value Millimeter
572 \value Point
573 \value Inch
574 \value Pica
575 \value Didot
576 \value Cicero
577 \value DevicePixel
578
579 Note the difference between Point and DevicePixel. The Point unit is
580 defined to be 1/72th of an inch, while the DevicePixel unit is
581 resolution dependant and is based on the actual pixels, or dots, on
582 the printer.
583*/
584
585
586/*
587 \enum QPrinter::PrintRange
588
589 This enum is used to specify which print range the application
590 should use to print.
591
592 \value AllPages All the pages should be printed.
593 \value Selection Only the selection should be printed.
594 \value PageRange Print according to the from page and to page options.
595
596 \sa setPrintRange(), printRange()
597*/
598
599/*
600 \enum QPrinter::PrinterOption
601
602 This enum describes various printer options that appear in the
603 printer setup dialog. It is used to enable and disable these
604 options in the setup dialog.
605
606 \value PrintToFile Describes if print to file should be enabled.
607 \value PrintSelection Describes if printing selections should be enabled.
608 \value PrintPageRange Describes if printing page ranges (from, to) should
609 be enabled
610
611 \sa setOptionEnabled(), isOptionEnabled()
612*/
613
614/*!
615 Creates a new printer object with the given \a mode.
616*/
617QPrinter::QPrinter(PrinterMode mode)
618 : QPaintDevice(),
619 d_ptr(new QPrinterPrivate(this))
620{
621 init(mode);
622 QPrinterInfo defPrn(QPrinterInfo::defaultPrinter());
623 if (!defPrn.isNull()) {
624 setPrinterName(defPrn.printerName());
625 } else if (QPrinterInfo::availablePrinters().isEmpty()
626 && d_ptr->paintEngine->type() != QPaintEngine::Windows
627 && d_ptr->paintEngine->type() != QPaintEngine::MacPrinter) {
628 setOutputFormat(QPrinter::PdfFormat);
629 }
630}
631
632/*!
633 \since 4.4
634
635 Creates a new printer object with the given \a printer and \a mode.
636*/
637QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode)
638 : QPaintDevice(),
639 d_ptr(new QPrinterPrivate(this))
640{
641 init(mode);
642 setPrinterName(printer.printerName());
643}
644
645void QPrinter::init(PrinterMode mode)
646{
647#if !defined(Q_WS_X11)
648 if (!qApp) {
649#else
650 if (!qApp || !X11) {
651#endif
652 qFatal("QPrinter: Must construct a QApplication before a QPaintDevice");
653 return;
654 }
655 Q_D(QPrinter);
656
657 d->printerMode = mode;
658 d->outputFormat = QPrinter::NativeFormat;
659 d->createDefaultEngines();
660
661#ifndef QT_NO_PRINTPREVIEWWIDGET
662 d->previewEngine = 0;
663#endif
664 d->realPrintEngine = 0;
665 d->realPaintEngine = 0;
666
667#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
668 if (QCUPSSupport::cupsVersion() >= 10200 && QCUPSSupport().currentPPD()) {
669 setOutputFormat(QPrinter::PdfFormat);
670 d->outputFormat = QPrinter::NativeFormat;
671 }
672#endif
673}
674
675/*!
676 This function is used by subclasses of QPrinter to specify custom
677 print and paint engines (\a printEngine and \a paintEngine,
678 respectively).
679
680 QPrinter does not take ownership of the engines, so you need to
681 manage these engine instances yourself.
682
683 Note that changing the engines will reset the printer state and
684 all its properties.
685
686 \sa printEngine() paintEngine() setOutputFormat()
687
688 \since 4.1
689*/
690void QPrinter::setEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine)
691{
692 Q_D(QPrinter);
693
694 if (d->use_default_engine)
695 delete d->printEngine;
696
697 d->printEngine = printEngine;
698 d->paintEngine = paintEngine;
699 d->use_default_engine = false;
700}
701
702/*!
703 Destroys the printer object and frees any allocated resources. If
704 the printer is destroyed while a print job is in progress this may
705 or may not affect the print job.
706*/
707QPrinter::~QPrinter()
708{
709 Q_D(QPrinter);
710 if (d->use_default_engine)
711 delete d->printEngine;
712#ifndef QT_NO_PRINTPREVIEWWIDGET
713 delete d->previewEngine;
714#endif
715}
716
717/*!
718 \enum QPrinter::OutputFormat
719
720 The OutputFormat enum is used to describe the format QPrinter should
721 use for printing.
722
723 \value NativeFormat QPrinter will print output using a method defined
724 by the platform it is running on. This mode is the default when printing
725 directly to a printer.
726
727 \value PdfFormat QPrinter will generate its output as a searchable PDF file.
728 This mode is the default when printing to a file.
729
730 \value PostScriptFormat QPrinter will generate its output as in the PostScript format.
731 (This feature was introduced in Qt 4.2.)
732
733 \sa outputFormat(), setOutputFormat(), setOutputFileName()
734*/
735
736/*!
737 \since 4.1
738
739 Sets the output format for this printer to \a format.
740*/
741void QPrinter::setOutputFormat(OutputFormat format)
742{
743
744#ifndef QT_NO_PDF
745 Q_D(QPrinter);
746 if (d->validPrinter && d->outputFormat == format)
747 return;
748 d->outputFormat = format;
749
750 QPrintEngine *oldPrintEngine = d->printEngine;
751 QPaintEngine *oldPaintEngine = d->paintEngine; // same as the above - shouldn't be deleted
752 const bool def_engine = d->use_default_engine;
753 d->printEngine = 0;
754
755 d->createDefaultEngines();
756
757 if (oldPrintEngine) {
758 for (int i = 0; i < d->manualSetList.size(); ++i) {
759 QPrintEngine::PrintEnginePropertyKey key = d->manualSetList[i];
760 QVariant prop;
761 // PPK_NumberOfCopies need special treatmeant since it in most cases
762 // will return 1, disregarding the actual value that was set
763 if (key == QPrintEngine::PPK_NumberOfCopies)
764 prop = QVariant(qt_printerRealNumCopies(oldPaintEngine));
765 else
766 prop = oldPrintEngine->property(key);
767 if (prop.isValid())
768 d->printEngine->setProperty(key, prop);
769 }
770 }
771
772 if (def_engine)
773 delete oldPrintEngine;
774
775 if (d->outputFormat == QPrinter::PdfFormat || d->outputFormat == QPrinter::PostScriptFormat)
776 d->validPrinter = true;
777#else
778 Q_UNUSED(format);
779#endif
780}
781
782/*!
783 \since 4.1
784
785 Returns the output format for this printer.
786*/
787QPrinter::OutputFormat QPrinter::outputFormat() const
788{
789 Q_D(const QPrinter);
790 return d->outputFormat;
791}
792
793
794
795/*! \internal
796*/
797int QPrinter::devType() const
798{
799 return QInternal::Printer;
800}
801
802/*!
803 Returns the printer name. This value is initially set to the name
804 of the default printer.
805
806 \sa setPrinterName()
807*/
808QString QPrinter::printerName() const
809{
810 Q_D(const QPrinter);
811 return d->printEngine->property(QPrintEngine::PPK_PrinterName).toString();
812}
813
814/*!
815 Sets the printer name to \a name.
816
817 \sa printerName(), isValid()
818*/
819void QPrinter::setPrinterName(const QString &name)
820{
821 Q_D(QPrinter);
822 ABORT_IF_ACTIVE("QPrinter::setPrinterName");
823
824#if defined(Q_OS_UNIX) && !defined(QT_NO_CUPS)
825 if(d->use_default_engine
826 && d->outputFormat == QPrinter::NativeFormat) {
827 if (QCUPSSupport::cupsVersion() >= 10200
828 && QCUPSSupport::printerHasPPD(name.toLocal8Bit().constData()))
829 setOutputFormat(QPrinter::PdfFormat);
830 else
831 setOutputFormat(QPrinter::PostScriptFormat);
832 d->outputFormat = QPrinter::NativeFormat;
833 }
834#endif
835
836 QList<QPrinterInfo> prnList = QPrinterInfo::availablePrinters();
837 if (name.isEmpty()) {
838 d->validPrinter = d->outputFormat == QPrinter::PdfFormat || d->outputFormat == QPrinter::PostScriptFormat;
839 } else {
840 d->validPrinter = false;
841 for (int i = 0; i < prnList.size(); ++i) {
842 if (prnList[i].printerName() == name) {
843 d->validPrinter = true;
844 break;
845 }
846 }
847 }
848
849 d->printEngine->setProperty(QPrintEngine::PPK_PrinterName, name);
850 d->addToManualSetList(QPrintEngine::PPK_PrinterName);
851}
852
853
854/*!
855 \since 4.4
856
857 Returns true if the printer currently selected is a valid printer
858 in the system, or a pure PDF/PostScript printer; otherwise returns false.
859
860 To detect other failures check the output of QPainter::begin() or QPrinter::newPage().
861
862 \snippet doc/src/snippets/printing-qprinter/errors.cpp 0
863
864 \sa setPrinterName()
865*/
866bool QPrinter::isValid() const
867{
868 Q_D(const QPrinter);
869#if defined(Q_WS_X11)
870 if (!qApp || !X11) {
871 return false;
872 }
873#endif
874 return d->validPrinter;
875}
876
877
878/*!
879 \fn bool QPrinter::outputToFile() const
880
881 Returns true if the output should be written to a file, or false
882 if the output should be sent directly to the printer. The default
883 setting is false.
884
885 \sa setOutputToFile(), setOutputFileName()
886*/
887
888
889/*!
890 \fn void QPrinter::setOutputToFile(bool enable)
891
892 Specifies whether the output should be written to a file or sent
893 directly to the printer.
894
895 Will output to a file if \a enable is true, or will output
896 directly to the printer if \a enable is false.
897
898 \sa outputToFile(), setOutputFileName()
899*/
900
901
902/*!
903 \fn QString QPrinter::outputFileName() const
904
905 Returns the name of the output file. By default, this is an empty string
906 (indicating that the printer shouldn't print to file).
907
908 \sa QPrintEngine::PrintEnginePropertyKey
909
910*/
911
912QString QPrinter::outputFileName() const
913{
914 Q_D(const QPrinter);
915 return d->printEngine->property(QPrintEngine::PPK_OutputFileName).toString();
916}
917
918/*!
919 Sets the name of the output file to \a fileName.
920
921 Setting a null or empty name (0 or "") disables printing to a file.
922 Setting a non-empty name enables printing to a file.
923
924 This can change the value of outputFormat(). If the file name has the
925 suffix ".ps" then PostScript is automatically selected as output format.
926 If the file name has the ".pdf" suffix PDF is generated. If the file name
927 has a suffix other than ".ps" and ".pdf", the output format used is the
928 one set with setOutputFormat().
929
930 QPrinter uses Qt's cross-platform PostScript or PDF print engines
931 respectively. If you can produce this format natively, for example
932 Mac OS X can generate PDF's from its print engine, set the output format
933 back to NativeFormat.
934
935 \sa outputFileName() setOutputToFile() setOutputFormat()
936*/
937
938void QPrinter::setOutputFileName(const QString &fileName)
939{
940 Q_D(QPrinter);
941 ABORT_IF_ACTIVE("QPrinter::setOutputFileName");
942
943 QFileInfo fi(fileName);
944 if (!fi.suffix().compare(QLatin1String("ps"), Qt::CaseInsensitive))
945 setOutputFormat(QPrinter::PostScriptFormat);
946 else if (!fi.suffix().compare(QLatin1String("pdf"), Qt::CaseInsensitive))
947 setOutputFormat(QPrinter::PdfFormat);
948 else if (fileName.isEmpty())
949 setOutputFormat(QPrinter::NativeFormat);
950
951 d->printEngine->setProperty(QPrintEngine::PPK_OutputFileName, fileName);
952 d->addToManualSetList(QPrintEngine::PPK_OutputFileName);
953}
954
955
956/*!
957 Returns the name of the program that sends the print output to the
958 printer.
959
960 The default is to return an empty string; meaning that QPrinter will try to
961 be smart in a system-dependent way. On X11 only, you can set it to something
962 different to use a specific print program. On the other platforms, this
963 returns an empty string.
964
965 \sa setPrintProgram(), setPrinterSelectionOption()
966*/
967QString QPrinter::printProgram() const
968{
969 Q_D(const QPrinter);
970 return d->printEngine->property(QPrintEngine::PPK_PrinterProgram).toString();
971}
972
973
974/*!
975 Sets the name of the program that should do the print job to \a
976 printProg.
977
978 On X11, this function sets the program to call with the PostScript
979 output. On other platforms, it has no effect.
980
981 \sa printProgram()
982*/
983void QPrinter::setPrintProgram(const QString &printProg)
984{
985 Q_D(QPrinter);
986 ABORT_IF_ACTIVE("QPrinter::setPrintProgram");
987 d->printEngine->setProperty(QPrintEngine::PPK_PrinterProgram, printProg);
988 d->addToManualSetList(QPrintEngine::PPK_PrinterProgram);
989}
990
991
992/*!
993 Returns the document name.
994
995 \sa setDocName(), QPrintEngine::PrintEnginePropertyKey
996*/
997QString QPrinter::docName() const
998{
999 Q_D(const QPrinter);
1000 return d->printEngine->property(QPrintEngine::PPK_DocumentName).toString();
1001}
1002
1003
1004/*!
1005 Sets the document name to \a name.
1006
1007 On X11, the document name is for example used as the default
1008 output filename in QPrintDialog. Note that the document name does
1009 not affect the file name if the printer is printing to a file.
1010 Use the setOutputFile() function for this.
1011
1012 \sa docName(), QPrintEngine::PrintEnginePropertyKey
1013*/
1014void QPrinter::setDocName(const QString &name)
1015{
1016 Q_D(QPrinter);
1017 ABORT_IF_ACTIVE("QPrinter::setDocName");
1018 d->printEngine->setProperty(QPrintEngine::PPK_DocumentName, name);
1019 d->addToManualSetList(QPrintEngine::PPK_DocumentName);
1020}
1021
1022
1023/*!
1024 Returns the name of the application that created the document.
1025
1026 \sa setCreator()
1027*/
1028QString QPrinter::creator() const
1029{
1030 Q_D(const QPrinter);
1031 return d->printEngine->property(QPrintEngine::PPK_Creator).toString();
1032}
1033
1034
1035/*!
1036 Sets the name of the application that created the document to \a
1037 creator.
1038
1039 This function is only applicable to the X11 version of Qt. If no
1040 creator name is specified, the creator will be set to "Qt"
1041 followed by some version number.
1042
1043 \sa creator()
1044*/
1045void QPrinter::setCreator(const QString &creator)
1046{
1047 Q_D(QPrinter);
1048 ABORT_IF_ACTIVE("QPrinter::setCreator");
1049 d->printEngine->setProperty(QPrintEngine::PPK_Creator, creator);
1050 d->addToManualSetList(QPrintEngine::PPK_Creator);
1051}
1052
1053
1054/*!
1055 Returns the orientation setting. This is driver-dependent, but is usually
1056 QPrinter::Portrait.
1057
1058 \sa setOrientation()
1059*/
1060QPrinter::Orientation QPrinter::orientation() const
1061{
1062 Q_D(const QPrinter);
1063 return QPrinter::Orientation(d->printEngine->property(QPrintEngine::PPK_Orientation).toInt());
1064}
1065
1066
1067/*!
1068 Sets the print orientation to \a orientation.
1069
1070 The orientation can be either QPrinter::Portrait or
1071 QPrinter::Landscape.
1072
1073 The printer driver reads this setting and prints using the
1074 specified orientation.
1075
1076 On Windows, this option can be changed while printing and will
1077 take effect from the next call to newPage().
1078
1079 On Mac OS X, changing the orientation during a print job has no effect.
1080
1081 \sa orientation()
1082*/
1083
1084void QPrinter::setOrientation(Orientation orientation)
1085{
1086 Q_D(QPrinter);
1087 d->printEngine->setProperty(QPrintEngine::PPK_Orientation, orientation);
1088 d->addToManualSetList(QPrintEngine::PPK_Orientation);
1089}
1090
1091
1092/*!
1093 \since 4.4
1094 Returns the printer paper size. The default value is driver-dependent.
1095
1096 \sa setPaperSize() pageRect() paperRect()
1097*/
1098
1099QPrinter::PaperSize QPrinter::paperSize() const
1100{
1101 Q_D(const QPrinter);
1102 return QPrinter::PaperSize(d->printEngine->property(QPrintEngine::PPK_PaperSize).toInt());
1103}
1104
1105/*!
1106 \since 4.4
1107
1108 Sets the printer paper size to \a newPaperSize if that size is
1109 supported. The result is undefined if \a newPaperSize is not
1110 supported.
1111
1112 The default paper size is driver-dependent.
1113
1114 This function is useful mostly for setting a default value that
1115 the user can override in the print dialog.
1116
1117 \sa paperSize() PaperSize setFullPage() setResolution() pageRect() paperRect()
1118*/
1119void QPrinter::setPaperSize(PaperSize newPaperSize)
1120{
1121 Q_D(QPrinter);
1122 if (d->paintEngine->type() != QPaintEngine::Pdf)
1123 ABORT_IF_ACTIVE("QPrinter::setPaperSize");
1124 if (newPaperSize < 0 || newPaperSize >= NPaperSize) {
1125 qWarning("QPrinter::setPaperSize: Illegal paper size %d", newPaperSize);
1126 return;
1127 }
1128 d->printEngine->setProperty(QPrintEngine::PPK_PaperSize, newPaperSize);
1129 d->addToManualSetList(QPrintEngine::PPK_PaperSize);
1130 d->hasUserSetPageSize = true;
1131}
1132
1133/*!
1134 \obsolete
1135
1136 Returns the printer page size. The default value is driver-dependent.
1137
1138 Use paperSize() instead.
1139*/
1140QPrinter::PageSize QPrinter::pageSize() const
1141{
1142 return paperSize();
1143}
1144
1145
1146/*!
1147 \obsolete
1148
1149 Sets the printer page size based on \a newPageSize.
1150
1151 Use setPaperSize() instead.
1152*/
1153
1154void QPrinter::setPageSize(PageSize newPageSize)
1155{
1156 setPaperSize(newPageSize);
1157}
1158
1159/*!
1160 \since 4.4
1161
1162 Sets the paper size based on \a paperSize in \a unit.
1163
1164 \sa paperSize()
1165*/
1166
1167void QPrinter::setPaperSize(const QSizeF &paperSize, QPrinter::Unit unit)
1168{
1169 Q_D(QPrinter);
1170 if (d->paintEngine->type() != QPaintEngine::Pdf)
1171 ABORT_IF_ACTIVE("QPrinter::setPaperSize");
1172 const qreal multiplier = qt_multiplierForUnit(unit, resolution());
1173 QSizeF size(paperSize.width() * multiplier, paperSize.height() * multiplier);
1174 d->printEngine->setProperty(QPrintEngine::PPK_CustomPaperSize, size);
1175 d->addToManualSetList(QPrintEngine::PPK_CustomPaperSize);
1176 d->hasUserSetPageSize = true;
1177}
1178
1179/*!
1180 \since 4.4
1181
1182 Returns the paper size in \a unit.
1183
1184 \sa setPaperSize()
1185*/
1186
1187QSizeF QPrinter::paperSize(Unit unit) const
1188{
1189 Q_D(const QPrinter);
1190 int res = resolution();
1191 const qreal multiplier = qt_multiplierForUnit(unit, res);
1192 PaperSize paperType = paperSize();
1193 if (paperType == Custom) {
1194 QSizeF size = d->printEngine->property(QPrintEngine::PPK_CustomPaperSize).toSizeF();
1195 return QSizeF(size.width() / multiplier, size.height() / multiplier);
1196 }
1197 else {
1198 return qt_printerPaperSize(orientation(), paperType, unit, res);
1199 }
1200}
1201
1202/*!
1203 Sets the page order to \a pageOrder.
1204
1205 The page order can be QPrinter::FirstPageFirst or
1206 QPrinter::LastPageFirst. The application is responsible for
1207 reading the page order and printing accordingly.
1208
1209 This function is mostly useful for setting a default value that
1210 the user can override in the print dialog.
1211
1212 This function is only supported under X11.
1213*/
1214
1215void QPrinter::setPageOrder(PageOrder pageOrder)
1216{
1217 Q_D(QPrinter);
1218 ABORT_IF_ACTIVE("QPrinter::setPageOrder");
1219 d->printEngine->setProperty(QPrintEngine::PPK_PageOrder, pageOrder);
1220 d->addToManualSetList(QPrintEngine::PPK_PageOrder);
1221}
1222
1223
1224/*!
1225 Returns the current page order.
1226
1227 The default page order is \c FirstPageFirst.
1228*/
1229
1230QPrinter::PageOrder QPrinter::pageOrder() const
1231{
1232 Q_D(const QPrinter);
1233 return QPrinter::PageOrder(d->printEngine->property(QPrintEngine::PPK_PageOrder).toInt());
1234}
1235
1236
1237/*!
1238 Sets the printer's color mode to \a newColorMode, which can be
1239 either \c Color or \c GrayScale.
1240
1241 \sa colorMode()
1242*/
1243
1244void QPrinter::setColorMode(ColorMode newColorMode)
1245{
1246 Q_D(QPrinter);
1247 ABORT_IF_ACTIVE("QPrinter::setColorMode");
1248 d->printEngine->setProperty(QPrintEngine::PPK_ColorMode, newColorMode);
1249 d->addToManualSetList(QPrintEngine::PPK_ColorMode);
1250}
1251
1252
1253/*!
1254 Returns the current color mode.
1255
1256 \sa setColorMode()
1257*/
1258QPrinter::ColorMode QPrinter::colorMode() const
1259{
1260 Q_D(const QPrinter);
1261 return QPrinter::ColorMode(d->printEngine->property(QPrintEngine::PPK_ColorMode).toInt());
1262}
1263
1264
1265/*!
1266 Returns the number of copies to be printed. The default value is 1.
1267
1268 On Windows, Mac OS X and X11 systems that support CUPS, this will always
1269 return 1 as these operating systems can internally handle the number
1270 of copies.
1271
1272 On X11, this value will return the number of times the application is
1273 required to print in order to match the number specified in the printer setup
1274 dialog. This has been done since some printer drivers are not capable of
1275 buffering up the copies and in those cases the application must make an
1276 explicit call to the print code for each copy.
1277
1278 \sa setNumCopies(), actualNumCopies()
1279*/
1280
1281int QPrinter::numCopies() const
1282{
1283 Q_D(const QPrinter);
1284 return d->printEngine->property(QPrintEngine::PPK_NumberOfCopies).toInt();
1285}
1286
1287
1288/*!
1289 \since 4.6
1290
1291 Returns the number of copies that will be printed. The default
1292 value is 1.
1293
1294 This function always returns the actual value specified in the print
1295 dialog or using setNumCopies().
1296
1297 \sa setNumCopies(), numCopies()
1298*/
1299int QPrinter::actualNumCopies() const
1300{
1301 Q_D(const QPrinter);
1302 return qt_printerRealNumCopies(d->paintEngine);
1303}
1304
1305
1306
1307/*!
1308 Sets the number of copies to be printed to \a numCopies.
1309
1310 The printer driver reads this setting and prints the specified
1311 number of copies.
1312
1313 \sa numCopies()
1314*/
1315
1316void QPrinter::setNumCopies(int numCopies)
1317{
1318 Q_D(QPrinter);
1319 ABORT_IF_ACTIVE("QPrinter::setNumCopies");
1320 d->printEngine->setProperty(QPrintEngine::PPK_NumberOfCopies, numCopies);
1321 d->addToManualSetList(QPrintEngine::PPK_NumberOfCopies);
1322}
1323
1324
1325/*!
1326 \since 4.1
1327
1328 Returns true if collation is turned on when multiple copies is selected.
1329 Returns false if it is turned off when multiple copies is selected.
1330 When collating is turned off the printing of each individual page will be repeated
1331 the numCopies() amount before the next page is started. With collating turned on
1332 all pages are printed before the next copy of those pages is started.
1333
1334 \sa setCollateCopies()
1335*/
1336bool QPrinter::collateCopies() const
1337{
1338 Q_D(const QPrinter);
1339 return d->printEngine->property(QPrintEngine::PPK_CollateCopies).toBool();
1340}
1341
1342
1343/*!
1344 \since 4.1
1345
1346 Sets the default value for collation checkbox when the print
1347 dialog appears. If \a collate is true, it will enable
1348 setCollateCopiesEnabled(). The default value is false. This value
1349 will be changed by what the user presses in the print dialog.
1350
1351 \sa collateCopies()
1352*/
1353void QPrinter::setCollateCopies(bool collate)
1354{
1355 Q_D(QPrinter);
1356 ABORT_IF_ACTIVE("QPrinter::setCollateCopies");
1357 d->printEngine->setProperty(QPrintEngine::PPK_CollateCopies, collate);
1358 d->addToManualSetList(QPrintEngine::PPK_CollateCopies);
1359}
1360
1361
1362
1363/*!
1364 If \a fp is true, enables support for painting over the entire page;
1365 otherwise restricts painting to the printable area reported by the
1366 device.
1367
1368 By default, full page printing is disabled. In this case, the origin
1369 of the QPrinter's coordinate system coincides with the top-left
1370 corner of the printable area.
1371
1372 If full page printing is enabled, the origin of the QPrinter's
1373 coordinate system coincides with the top-left corner of the paper
1374 itself. In this case, the
1375 \l{QPaintDevice::PaintDeviceMetric}{device metrics} will report
1376 the exact same dimensions as indicated by \l{PaperSize}. It may not
1377 be possible to print on the entire physical page because of the
1378 printer's margins, so the application must account for the margins
1379 itself.
1380
1381 \sa fullPage(), setPaperSize(), width(), height(), {Printing with Qt}
1382*/
1383
1384void QPrinter::setFullPage(bool fp)
1385{
1386 Q_D(QPrinter);
1387 d->printEngine->setProperty(QPrintEngine::PPK_FullPage, fp);
1388 d->addToManualSetList(QPrintEngine::PPK_FullPage);
1389}
1390
1391
1392/*!
1393 Returns true if the origin of the printer's coordinate system is
1394 at the corner of the page and false if it is at the edge of the
1395 printable area.
1396
1397 See setFullPage() for details and caveats.
1398
1399 \sa setFullPage() PaperSize
1400*/
1401
1402bool QPrinter::fullPage() const
1403{
1404 Q_D(const QPrinter);
1405 return d->printEngine->property(QPrintEngine::PPK_FullPage).toBool();
1406}
1407
1408
1409/*!
1410 Requests that the printer prints at \a dpi or as near to \a dpi as
1411 possible.
1412
1413 This setting affects the coordinate system as returned by, for
1414 example QPainter::viewport().
1415
1416 This function must be called before QPainter::begin() to have an effect on
1417 all platforms.
1418
1419 \sa resolution() setPaperSize()
1420*/
1421
1422void QPrinter::setResolution(int dpi)
1423{
1424 Q_D(QPrinter);
1425 ABORT_IF_ACTIVE("QPrinter::setResolution");
1426 d->printEngine->setProperty(QPrintEngine::PPK_Resolution, dpi);
1427 d->addToManualSetList(QPrintEngine::PPK_Resolution);
1428}
1429
1430
1431/*!
1432 Returns the current assumed resolution of the printer, as set by
1433 setResolution() or by the printer driver.
1434
1435 \sa setResolution()
1436*/
1437
1438int QPrinter::resolution() const
1439{
1440 Q_D(const QPrinter);
1441 return d->printEngine->property(QPrintEngine::PPK_Resolution).toInt();
1442}
1443
1444/*!
1445 Sets the paper source setting to \a source.
1446
1447 Windows only: This option can be changed while printing and will
1448 take effect from the next call to newPage()
1449
1450 \sa paperSource()
1451*/
1452
1453void QPrinter::setPaperSource(PaperSource source)
1454{
1455 Q_D(QPrinter);
1456 d->printEngine->setProperty(QPrintEngine::PPK_PaperSource, source);
1457 d->addToManualSetList(QPrintEngine::PPK_PaperSource);
1458}
1459
1460/*!
1461 Returns the printer's paper source. This is \c Manual or a printer
1462 tray or paper cassette.
1463*/
1464QPrinter::PaperSource QPrinter::paperSource() const
1465{
1466 Q_D(const QPrinter);
1467 return QPrinter::PaperSource(d->printEngine->property(QPrintEngine::PPK_PaperSource).toInt());
1468}
1469
1470
1471/*!
1472 \since 4.1
1473
1474 Enabled or disables font embedding depending on \a enable.
1475
1476 Currently this option is only supported on X11.
1477
1478 \sa fontEmbeddingEnabled()
1479*/
1480void QPrinter::setFontEmbeddingEnabled(bool enable)
1481{
1482 Q_D(QPrinter);
1483 d->printEngine->setProperty(QPrintEngine::PPK_FontEmbedding, enable);
1484 d->addToManualSetList(QPrintEngine::PPK_FontEmbedding);
1485}
1486
1487/*!
1488 \since 4.1
1489
1490 Returns true if font embedding is enabled.
1491
1492 Currently this option is only supported on X11.
1493
1494 \sa setFontEmbeddingEnabled()
1495*/
1496bool QPrinter::fontEmbeddingEnabled() const
1497{
1498 Q_D(const QPrinter);
1499 return d->printEngine->property(QPrintEngine::PPK_FontEmbedding).toBool();
1500}
1501
1502/*!
1503 \enum QPrinter::DuplexMode
1504 \since 4.4
1505
1506 This enum is used to indicate whether printing will occur on one or both sides
1507 of each sheet of paper (simplex or duplex printing).
1508
1509 \value DuplexNone Single sided (simplex) printing only.
1510 \value DuplexAuto The printer's default setting is used to determine whether
1511 duplex printing is used.
1512 \value DuplexLongSide Both sides of each sheet of paper are used for printing.
1513 The paper is turned over its longest edge before the second
1514 side is printed
1515 \value DuplexShortSide Both sides of each sheet of paper are used for printing.
1516 The paper is turned over its shortest edge before the second
1517 side is printed
1518*/
1519
1520/*!
1521 \since 4.2
1522
1523 Enables double sided printing if \a doubleSided is true; otherwise disables it.
1524
1525 Currently this option is only supported on X11.
1526*/
1527void QPrinter::setDoubleSidedPrinting(bool doubleSided)
1528{
1529 setDuplex(doubleSided ? DuplexAuto : DuplexNone);
1530}
1531
1532
1533/*!
1534 \since 4.2
1535
1536 Returns true if double side printing is enabled.
1537
1538 Currently this option is only supported on X11.
1539*/
1540bool QPrinter::doubleSidedPrinting() const
1541{
1542 return duplex() != DuplexNone;
1543}
1544
1545/*!
1546 \since 4.4
1547
1548 Enables double sided printing based on the \a duplex mode.
1549
1550 Currently this option is only supported on X11.
1551*/
1552void QPrinter::setDuplex(DuplexMode duplex)
1553{
1554 Q_D(QPrinter);
1555 d->printEngine->setProperty(QPrintEngine::PPK_Duplex, duplex);
1556 d->addToManualSetList(QPrintEngine::PPK_Duplex);
1557}
1558
1559/*!
1560 \since 4.4
1561
1562 Returns the current duplex mode.
1563
1564 Currently this option is only supported on X11.
1565*/
1566QPrinter::DuplexMode QPrinter::duplex() const
1567{
1568 Q_D(const QPrinter);
1569 return static_cast <DuplexMode> (d->printEngine->property(QPrintEngine::PPK_Duplex).toInt());
1570}
1571
1572/*!
1573 \since 4.4
1574
1575 Returns the page's rectangle in \a unit; this is usually smaller
1576 than the paperRect() since the page normally has margins between
1577 its borders and the paper.
1578
1579 \sa paperSize()
1580*/
1581QRectF QPrinter::pageRect(Unit unit) const
1582{
1583 Q_D(const QPrinter);
1584 int res = resolution();
1585 const qreal multiplier = qt_multiplierForUnit(unit, res);
1586 // the page rect is in device pixels
1587 QRect devRect(d->printEngine->property(QPrintEngine::PPK_PageRect).toRect());
1588 if (unit == DevicePixel)
1589 return devRect;
1590 QRectF diRect(devRect.x()*72.0/res,
1591 devRect.y()*72.0/res,
1592 devRect.width()*72.0/res,
1593 devRect.height()*72.0/res);
1594 return QRectF(diRect.x()/multiplier, diRect.y()/multiplier,
1595 diRect.width()/multiplier, diRect.height()/multiplier);
1596}
1597
1598
1599/*!
1600 \since 4.4
1601
1602 Returns the paper's rectangle in \a unit; this is usually larger
1603 than the pageRect().
1604
1605 \sa pageRect()
1606*/
1607QRectF QPrinter::paperRect(Unit unit) const
1608{
1609 Q_D(const QPrinter);
1610 int res = resolution();
1611 const qreal multiplier = qt_multiplierForUnit(unit, resolution());
1612 // the page rect is in device pixels
1613 QRect devRect(d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect());
1614 if (unit == DevicePixel)
1615 return devRect;
1616 QRectF diRect(devRect.x()*72.0/res,
1617 devRect.y()*72.0/res,
1618 devRect.width()*72.0/res,
1619 devRect.height()*72.0/res);
1620 return QRectF(diRect.x()/multiplier, diRect.y()/multiplier,
1621 diRect.width()/multiplier, diRect.height()/multiplier);
1622}
1623
1624/*!
1625 Returns the page's rectangle; this is usually smaller than the
1626 paperRect() since the page normally has margins between its
1627 borders and the paper.
1628
1629 The unit of the returned rectangle is DevicePixel.
1630
1631 \sa paperSize()
1632*/
1633QRect QPrinter::pageRect() const
1634{
1635 Q_D(const QPrinter);
1636 return d->printEngine->property(QPrintEngine::PPK_PageRect).toRect();
1637}
1638
1639/*!
1640 Returns the paper's rectangle; this is usually larger than the
1641 pageRect().
1642
1643 The unit of the returned rectangle is DevicePixel.
1644
1645 \sa pageRect()
1646*/
1647QRect QPrinter::paperRect() const
1648{
1649 Q_D(const QPrinter);
1650 return d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect();
1651}
1652
1653
1654/*!
1655 \since 4.4
1656
1657 This function sets the \a left, \a top, \a right and \a bottom
1658 page margins for this printer. The unit of the margins are
1659 specified with the \a unit parameter.
1660*/
1661void QPrinter::setPageMargins(qreal left, qreal top, qreal right, qreal bottom, QPrinter::Unit unit)
1662{
1663 Q_D(QPrinter);
1664 const qreal multiplier = qt_multiplierForUnit(unit, resolution());
1665 QList<QVariant> margins;
1666 margins << (left * multiplier) << (top * multiplier)
1667 << (right * multiplier) << (bottom * multiplier);
1668 d->printEngine->setProperty(QPrintEngine::PPK_PageMargins, margins);
1669 d->addToManualSetList(QPrintEngine::PPK_PageMargins);
1670 d->hasCustomPageMargins = true;
1671}
1672
1673/*!
1674 \since 4.4
1675
1676 Returns the page margins for this printer in \a left, \a top, \a
1677 right, \a bottom. The unit of the returned margins are specified
1678 with the \a unit parameter.
1679*/
1680void QPrinter::getPageMargins(qreal *left, qreal *top, qreal *right, qreal *bottom, QPrinter::Unit unit) const
1681{
1682 Q_D(const QPrinter);
1683 Q_ASSERT(left && top && right && bottom);
1684 const qreal multiplier = qt_multiplierForUnit(unit, resolution());
1685 QList<QVariant> margins(d->printEngine->property(QPrintEngine::PPK_PageMargins).toList());
1686 *left = margins.at(0).toReal() / multiplier;
1687 *top = margins.at(1).toReal() / multiplier;
1688 *right = margins.at(2).toReal() / multiplier;
1689 *bottom = margins.at(3).toReal() / multiplier;
1690}
1691
1692/*!
1693 \internal
1694
1695 Returns the metric for the given \a id.
1696*/
1697int QPrinter::metric(PaintDeviceMetric id) const
1698{
1699 Q_D(const QPrinter);
1700 return d->printEngine->metric(id);
1701}
1702
1703/*!
1704 Returns the paint engine used by the printer.
1705*/
1706QPaintEngine *QPrinter::paintEngine() const
1707{
1708 Q_D(const QPrinter);
1709 return d->paintEngine;
1710}
1711
1712/*!
1713 \since 4.1
1714
1715 Returns the print engine used by the printer.
1716*/
1717QPrintEngine *QPrinter::printEngine() const
1718{
1719 Q_D(const QPrinter);
1720 return d->printEngine;
1721}
1722
1723#if defined (Q_WS_WIN)
1724/*!
1725 Sets the page size to be used by the printer under Windows to \a
1726 pageSize.
1727
1728 \warning This function is not portable so you may prefer to use
1729 setPaperSize() instead.
1730
1731 \sa winPageSize()
1732*/
1733void QPrinter::setWinPageSize(int pageSize)
1734{
1735 Q_D(QPrinter);
1736 ABORT_IF_ACTIVE("QPrinter::setWinPageSize");
1737 d->printEngine->setProperty(QPrintEngine::PPK_WindowsPageSize, pageSize);
1738 d->addToManualSetList(QPrintEngine::PPK_WindowsPageSize);
1739}
1740
1741/*!
1742 Returns the page size used by the printer under Windows.
1743
1744 \warning This function is not portable so you may prefer to use
1745 paperSize() instead.
1746
1747 \sa setWinPageSize()
1748*/
1749int QPrinter::winPageSize() const
1750{
1751 Q_D(const QPrinter);
1752 return d->printEngine->property(QPrintEngine::PPK_WindowsPageSize).toInt();
1753}
1754#endif // Q_WS_WIN
1755
1756/*!
1757 Returns a list of the resolutions (a list of dots-per-inch
1758 integers) that the printer says it supports.
1759
1760 For X11 where all printing is directly to postscript, this
1761 function will always return a one item list containing only the
1762 postscript resolution, i.e., 72 (72 dpi -- but see PrinterMode).
1763*/
1764QList<int> QPrinter::supportedResolutions() const
1765{
1766 Q_D(const QPrinter);
1767 QList<QVariant> varlist
1768 = d->printEngine->property(QPrintEngine::PPK_SupportedResolutions).toList();
1769 QList<int> intlist;
1770 for (int i=0; i<varlist.size(); ++i)
1771 intlist << varlist.at(i).toInt();
1772 return intlist;
1773}
1774
1775/*!
1776 Tells the printer to eject the current page and to continue
1777 printing on a new page. Returns true if this was successful;
1778 otherwise returns false.
1779
1780 Calling newPage() on an inactive QPrinter object will always
1781 fail.
1782*/
1783bool QPrinter::newPage()
1784{
1785 Q_D(QPrinter);
1786 if (d->printEngine->printerState() != QPrinter::Active)
1787 return false;
1788 return d->printEngine->newPage();
1789}
1790
1791/*!
1792 Aborts the current print run. Returns true if the print run was
1793 successfully aborted and printerState() will return QPrinter::Aborted; otherwise
1794 returns false.
1795
1796 It is not always possible to abort a print job. For example,
1797 all the data has gone to the printer but the printer cannot or
1798 will not cancel the job when asked to.
1799*/
1800bool QPrinter::abort()
1801{
1802 Q_D(QPrinter);
1803 return d->printEngine->abort();
1804}
1805
1806/*!
1807 Returns the current state of the printer. This may not always be
1808 accurate (for example if the printer doesn't have the capability
1809 of reporting its state to the operating system).
1810*/
1811QPrinter::PrinterState QPrinter::printerState() const
1812{
1813 Q_D(const QPrinter);
1814 return d->printEngine->printerState();
1815}
1816
1817
1818/*! \fn void QPrinter::margins(uint *top, uint *left, uint *bottom, uint *right) const
1819
1820 Sets *\a top, *\a left, *\a bottom, *\a right to be the top,
1821 left, bottom, and right margins.
1822
1823 This function has been superseded by paperRect() and pageRect().
1824 Use paperRect().top() - pageRect().top() for the top margin,
1825 paperRect().left() - pageRect().left() for the left margin,
1826 paperRect().bottom() - pageRect().bottom() for the bottom margin,
1827 and papaerRect().right() - pageRect().right() for the right
1828 margin.
1829
1830 \oldcode
1831 uint rightMargin;
1832 uint bottomMargin;
1833 printer->margins(0, 0, &bottomMargin, &rightMargin);
1834 \newcode
1835 int rightMargin = printer->paperRect().right() - printer->pageRect().right();
1836 int bottomMargin = printer->paperRect().bottom() - printer->pageRect().bottom();
1837 \endcode
1838*/
1839
1840/*! \fn QSize QPrinter::margins() const
1841
1842 \overload
1843
1844 Returns a QSize containing the left margin and the top margin.
1845
1846 This function has been superseded by paperRect() and pageRect().
1847 Use paperRect().left() - pageRect().left() for the left margin,
1848 and paperRect().top() - pageRect().top() for the top margin.
1849
1850 \oldcode
1851 QSize margins = printer->margins();
1852 int leftMargin = margins.width();
1853 int topMargin = margins.height();
1854 \newcode
1855 int leftMargin = printer->paperRect().left() - printer->pageRect().left();
1856 int topMargin = printer->paperRect().top() - printer->pageRect().top();
1857 \endcode
1858*/
1859
1860/*! \fn bool QPrinter::aborted()
1861
1862 Use printerState() == QPrinter::Aborted instead.
1863*/
1864
1865#ifdef Q_WS_WIN
1866/*!
1867 \internal
1868*/
1869HDC QPrinter::getDC() const
1870{
1871 Q_D(const QPrinter);
1872 return d->printEngine->getPrinterDC();
1873}
1874
1875/*!
1876 \internal
1877*/
1878void QPrinter::releaseDC(HDC hdc) const
1879{
1880 Q_D(const QPrinter);
1881 d->printEngine->releasePrinterDC(hdc);
1882}
1883
1884/*!
1885 Returns the supported paper sizes for this printer.
1886
1887 The values will be either a value that matches an entry in the
1888 QPrinter::PaperSource enum or a driver spesific value. The driver
1889 spesific values are greater than the constant DMBIN_USER declared
1890 in wingdi.h.
1891
1892 \warning This function is only available in windows.
1893*/
1894
1895QList<QPrinter::PaperSource> QPrinter::supportedPaperSources() const
1896{
1897 Q_D(const QPrinter);
1898 QVariant v = d->printEngine->property(QPrintEngine::PPK_PaperSources);
1899
1900 QList<QVariant> variant_list = v.toList();
1901 QList<QPrinter::PaperSource> int_list;
1902 for (int i=0; i<variant_list.size(); ++i)
1903 int_list << (QPrinter::PaperSource) variant_list.at(i).toInt();
1904
1905 return int_list;
1906}
1907
1908#endif
1909
1910/*!
1911 \fn QString QPrinter::printerSelectionOption() const
1912
1913 Returns the printer options selection string. This is useful only
1914 if the print command has been explicitly set.
1915
1916 The default value (an empty string) implies that the printer should
1917 be selected in a system-dependent manner.
1918
1919 Any other value implies that the given value should be used.
1920
1921 \warning This function is not available on Windows.
1922
1923 \sa setPrinterSelectionOption()
1924*/
1925
1926/*!
1927 \fn void QPrinter::setPrinterSelectionOption(const QString &option)
1928
1929 Sets the printer to use \a option to select the printer. \a option
1930 is null by default (which implies that Qt should be smart enough
1931 to guess correctly), but it can be set to other values to use a
1932 specific printer selection option.
1933
1934 If the printer selection option is changed while the printer is
1935 active, the current print job may or may not be affected.
1936
1937 \warning This function is not available on Windows.
1938
1939 \sa printerSelectionOption()
1940*/
1941
1942#ifndef Q_WS_WIN
1943QString QPrinter::printerSelectionOption() const
1944{
1945 Q_D(const QPrinter);
1946 return d->printEngine->property(QPrintEngine::PPK_SelectionOption).toString();
1947}
1948
1949void QPrinter::setPrinterSelectionOption(const QString &option)
1950{
1951 Q_D(QPrinter);
1952 d->printEngine->setProperty(QPrintEngine::PPK_SelectionOption, option);
1953 d->addToManualSetList(QPrintEngine::PPK_SelectionOption);
1954}
1955#endif
1956
1957/*!
1958 \since 4.1
1959 \fn int QPrinter::fromPage() const
1960
1961 Returns the number of the first page in a range of pages to be printed
1962 (the "from page" setting). Pages in a document are numbered according to
1963 the convention that the first page is page 1.
1964
1965 By default, this function returns a special value of 0, meaning that
1966 the "from page" setting is unset.
1967
1968 \note If fromPage() and toPage() both return 0, this indicates that
1969 \e{the whole document will be printed}.
1970
1971 \sa setFromTo(), toPage()
1972*/
1973
1974int QPrinter::fromPage() const
1975{
1976 Q_D(const QPrinter);
1977 return d->fromPage;
1978}
1979
1980/*!
1981 \since 4.1
1982
1983 Returns the number of the last page in a range of pages to be printed
1984 (the "to page" setting). Pages in a document are numbered according to
1985 the convention that the first page is page 1.
1986
1987 By default, this function returns a special value of 0, meaning that
1988 the "to page" setting is unset.
1989
1990 \note If fromPage() and toPage() both return 0, this indicates that
1991 \e{the whole document will be printed}.
1992
1993 The programmer is responsible for reading this setting and
1994 printing accordingly.
1995
1996 \sa setFromTo(), fromPage()
1997*/
1998
1999int QPrinter::toPage() const
2000{
2001 Q_D(const QPrinter);
2002 return d->toPage;
2003}
2004
2005/*!
2006 \since 4.1
2007
2008 Sets the range of pages to be printed to cover the pages with numbers
2009 specified by \a from and \a to, where \a from corresponds to the first
2010 page in the range and \a to corresponds to the last.
2011
2012 \note Pages in a document are numbered according to the convention that
2013 the first page is page 1. However, if \a from and \a to are both set to 0,
2014 the \e{whole document will be printed}.
2015
2016 This function is mostly used to set a default value that the user can
2017 override in the print dialog when you call setup().
2018
2019 \sa fromPage(), toPage()
2020*/
2021
2022void QPrinter::setFromTo(int from, int to)
2023{
2024 Q_D(QPrinter);
2025 if (from > to) {
2026 qWarning() << "QPrinter::setFromTo: 'from' must be less than or equal to 'to'";
2027 from = to;
2028 }
2029 d->fromPage = from;
2030 d->toPage = to;
2031
2032 if (d->minPage == 0 && d->maxPage == 0) {
2033 d->minPage = 1;
2034 d->maxPage = to;
2035 d->options |= QAbstractPrintDialog::PrintPageRange;
2036 }
2037}
2038
2039/*!
2040 \since 4.1
2041
2042 Sets the print range option in to be \a range.
2043*/
2044void QPrinter::setPrintRange( PrintRange range )
2045{
2046 Q_D(QPrinter);
2047 d->printRange = QAbstractPrintDialog::PrintRange(range);
2048}
2049
2050/*!
2051 \since 4.1
2052
2053 Returns the page range of the QPrinter. After the print setup
2054 dialog has been opened, this function returns the value selected
2055 by the user.
2056
2057 \sa setPrintRange()
2058*/
2059QPrinter::PrintRange QPrinter::printRange() const
2060{
2061 Q_D(const QPrinter);
2062 return PrintRange(d->printRange);
2063}
2064
2065#if defined(QT3_SUPPORT)
2066
2067void QPrinter::setOutputToFile(bool f)
2068{
2069 if (f) {
2070 if (outputFileName().isEmpty())
2071 setOutputFileName(QLatin1String("untitled_printer_document"));
2072 } else {
2073 setOutputFileName(QString());
2074 }
2075}
2076
2077bool qt_compat_QPrinter_printSetup(QPrinter *printer, QPrinterPrivate *pd, QWidget *parent)
2078{
2079 Q_UNUSED(pd);
2080 QPrintDialog dlg(printer, parent);
2081 return dlg.exec() != 0;
2082}
2083
2084
2085#ifdef Q_WS_MAC
2086bool qt_compat_QPrinter_pageSetup(QPrinter *p, QWidget *parent)
2087{
2088 QPageSetupDialog psd(p, parent);
2089 return psd.exec() != 0;
2090}
2091
2092/*!
2093 Executes a page setup dialog so that the user can configure the type of
2094 page used for printing. Returns true if the contents of the dialog are
2095 accepted; returns false if the dialog is canceled.
2096*/
2097bool QPrinter::pageSetup(QWidget *parent)
2098{
2099 return qt_compat_QPrinter_pageSetup(this, parent);
2100}
2101
2102/*!
2103 Executes a print setup dialog so that the user can configure the printing
2104 process. Returns true if the contents of the dialog are accepted; returns
2105 false if the dialog is canceled.
2106*/
2107bool QPrinter::printSetup(QWidget *parent)
2108{
2109 Q_D(QPrinter);
2110 return qt_compat_QPrinter_printSetup(this, d, parent);
2111}
2112#endif // Q_WS_MAC
2113
2114/*!
2115 Use QPrintDialog instead.
2116
2117 \oldcode
2118 if (printer->setup(parent))
2119 ...
2120 \newcode
2121 QPrintDialog dialog(printer, parent);
2122 if (dialog.exec())
2123 ...
2124 \endcode
2125*/
2126bool QPrinter::setup(QWidget *parent)
2127{
2128 Q_D(QPrinter);
2129 return qt_compat_QPrinter_printSetup(this, d, parent)
2130#ifdef Q_WS_MAC
2131 && qt_compat_QPrinter_pageSetup(this, parent);
2132#endif
2133 ;
2134}
2135
2136/*!
2137 Use QPrintDialog::minPage() instead.
2138*/
2139int QPrinter::minPage() const
2140{
2141 Q_D(const QPrinter);
2142 return d->minPage;
2143}
2144
2145/*!
2146 Use QPrintDialog::maxPage() instead.
2147*/
2148int QPrinter::maxPage() const
2149{
2150 Q_D(const QPrinter);
2151 return d->maxPage;
2152}
2153
2154/*!
2155 Use QPrintDialog::setMinMax() instead.
2156*/
2157void QPrinter::setMinMax( int minPage, int maxPage )
2158{
2159 Q_D(QPrinter);
2160 Q_ASSERT_X(minPage <= maxPage, "QPrinter::setMinMax",
2161 "'min' must be less than or equal to 'max'");
2162 d->minPage = minPage;
2163 d->maxPage = maxPage;
2164 d->options |= QPrintDialog::PrintPageRange;
2165}
2166
2167/*!
2168 Returns true if the printer is set up to collate copies of printed documents;
2169 otherwise returns false.
2170
2171 Use QPrintDialog::isOptionEnabled(QPrintDialog::PrintCollateCopies)
2172 instead.
2173
2174 \sa collateCopies()
2175*/
2176bool QPrinter::collateCopiesEnabled() const
2177{
2178 Q_D(const QPrinter);
2179 return (d->options & QPrintDialog::PrintCollateCopies);
2180}
2181
2182/*!
2183 Use QPrintDialog::setOption(QPrintDialog::PrintCollateCopies)
2184 or QPrintDialog::setOptions(QPrintDialog::options()
2185 & ~QPrintDialog::PrintCollateCopies) instead, depending on \a
2186 enable.
2187*/
2188void QPrinter::setCollateCopiesEnabled(bool enable)
2189{
2190 Q_D(QPrinter);
2191
2192 if (enable)
2193 d->options |= QPrintDialog::PrintCollateCopies;
2194 else
2195 d->options &= ~QPrintDialog::PrintCollateCopies;
2196}
2197
2198/*!
2199 Use QPrintDialog instead.
2200*/
2201void QPrinter::setOptionEnabled( PrinterOption option, bool enable )
2202{
2203 Q_D(QPrinter);
2204 if (enable)
2205 d->options |= QPrintDialog::PrintDialogOption(1 << option);
2206 else
2207 d->options &= ~QPrintDialog::PrintDialogOption(1 << option);
2208}
2209
2210/*!
2211 Use QPrintDialog instead.
2212*/
2213bool QPrinter::isOptionEnabled( PrinterOption option ) const
2214{
2215 Q_D(const QPrinter);
2216 return (d->options & QPrintDialog::PrintDialogOption(option));
2217}
2218
2219#endif // QT3_SUPPORT
2220
2221/*!
2222 \class QPrintEngine
2223 \reentrant
2224
2225 \ingroup printing
2226
2227 \brief The QPrintEngine class defines an interface for how QPrinter
2228 interacts with a given printing subsystem.
2229
2230 The common case when creating your own print engine is to derive from both
2231 QPaintEngine and QPrintEngine. Various properties of a print engine are
2232 given with property() and set with setProperty().
2233
2234 \sa QPaintEngine
2235*/
2236
2237/*!
2238 \enum QPrintEngine::PrintEnginePropertyKey
2239
2240 This enum is used to communicate properties between the print
2241 engine and QPrinter. A property may or may not be supported by a
2242 given print engine.
2243
2244 \value PPK_CollateCopies A boolean value indicating whether the
2245 printout should be collated or not.
2246
2247 \value PPK_ColorMode Refers to QPrinter::ColorMode, either color or
2248 monochrome.
2249
2250 \value PPK_Creator A string describing the document's creator.
2251
2252 \value PPK_Duplex A boolean value indicating whether both sides of
2253 the printer paper should be used for the printout.
2254
2255 \value PPK_DocumentName A string describing the document name in
2256 the spooler.
2257
2258 \value PPK_FontEmbedding A boolean value indicating whether data for
2259 the document's fonts should be embedded in the data sent to the
2260 printer.
2261
2262 \value PPK_FullPage A boolean describing if the printer should be
2263 full page or not.
2264
2265 \value PPK_NumberOfCopies An integer specifying the number of
2266 copies
2267
2268 \value PPK_Orientation Specifies a QPrinter::Orientation value.
2269
2270 \value PPK_OutputFileName The output file name as a string. An
2271 empty file name indicates that the printer should not print to a file.
2272
2273 \value PPK_PageOrder Specifies a QPrinter::PageOrder value.
2274
2275 \value PPK_PageRect A QRect specifying the page rectangle
2276
2277 \value PPK_PageSize Obsolete. Use PPK_PaperSize instead.
2278
2279 \value PPK_PaperRect A QRect specifying the paper rectangle.
2280
2281 \value PPK_PaperSource Specifies a QPrinter::PaperSource value.
2282
2283 \value PPK_PaperSources Specifies more than one QPrinter::PaperSource value.
2284
2285 \value PPK_PaperSize Specifies a QPrinter::PaperSize value.
2286
2287 \value PPK_PrinterName A string specifying the name of the printer.
2288
2289 \value PPK_PrinterProgram A string specifying the name of the
2290 printer program used for printing,
2291
2292 \value PPK_Resolution An integer describing the dots per inch for
2293 this printer.
2294
2295 \value PPK_SelectionOption
2296
2297 \value PPK_SupportedResolutions A list of integer QVariants
2298 describing the set of supported resolutions that the printer has.
2299
2300 \value PPK_SuppressSystemPrintStatus Suppress the built-in dialog for showing
2301 printing progress. As of 4.1 this only has effect on Mac OS X where, by default,
2302 a status dialog is shown.
2303
2304 \value PPK_WindowsPageSize An integer specifying a DM_PAPER entry
2305 on Windows.
2306
2307 \value PPK_CustomPaperSize A QSizeF specifying a custom paper size
2308 in the QPrinter::Point unit.
2309
2310 \value PPK_PageMargins A QList<QVariant> containing the left, top,
2311 right and bottom margin values.
2312
2313 \value PPK_CustomBase Basis for extension.
2314*/
2315
2316/*!
2317 \fn QPrintEngine::~QPrintEngine()
2318
2319 Destroys the print engine.
2320*/
2321
2322/*!
2323 \fn void QPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
2324
2325 Sets the print engine's property specified by \a key to the given \a value.
2326
2327 \sa property()
2328*/
2329
2330/*!
2331 \fn void QPrintEngine::property(PrintEnginePropertyKey key) const
2332
2333 Returns the print engine's property specified by \a key.
2334
2335 \sa setProperty()
2336*/
2337
2338/*!
2339 \fn bool QPrintEngine::newPage()
2340
2341 Instructs the print engine to start a new page. Returns true if
2342 the printer was able to create the new page; otherwise returns false.
2343*/
2344
2345/*!
2346 \fn bool QPrintEngine::abort()
2347
2348 Instructs the print engine to abort the printing process. Returns
2349 true if successful; otherwise returns false.
2350*/
2351
2352/*!
2353 \fn int QPrintEngine::metric(QPaintDevice::PaintDeviceMetric id) const
2354
2355 Returns the metric for the given \a id.
2356*/
2357
2358/*!
2359 \fn QPrinter::PrinterState QPrintEngine::printerState() const
2360
2361 Returns the current state of the printer being used by the print engine.
2362*/
2363
2364/*!
2365 \fn HDC QPrintEngine::getPrinterDC() const
2366 \internal
2367*/
2368
2369/*!
2370 \fn void QPrintEngine::releasePrinterDC(HDC) const
2371 \internal
2372*/
2373
2374/*
2375 Returns the dimensions for the given paper size, \a size, in millimeters.
2376*/
2377QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size)
2378{
2379 if (size == QPrinter::Custom) return QSizeF(0, 0);
2380 return QSizeF(qt_paperSizes[size][0], qt_paperSizes[size][1]);
2381}
2382
2383/*
2384 Returns the PaperSize type that matches \a size, where \a size
2385 is in millimeters.
2386
2387 Because dimensions may not always be completely accurate (for
2388 example when converting between units), a particular PaperSize
2389 will be returned if it matches within -1/+1 millimeters.
2390*/
2391QPrinter::PaperSize qSizeFTopaperSize(const QSizeF& size)
2392{
2393 for (int i = 0; i < static_cast<int>(QPrinter::NPaperSize); ++i) {
2394 if (qt_paperSizes[i][0] >= size.width() - 1 &&
2395 qt_paperSizes[i][0] <= size.width() + 1 &&
2396 qt_paperSizes[i][1] >= size.height() - 1 &&
2397 qt_paperSizes[i][1] <= size.height() + 1) {
2398 return QPrinter::PaperSize(i);
2399 }
2400 }
2401
2402 return QPrinter::Custom;
2403}
2404
2405QT_END_NAMESPACE
2406
2407#endif // QT_NO_PRINTER
Note: See TracBrowser for help on using the repository browser.