summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2011-08-17 11:26:51 +0200
committerLars Knoll <lars.knoll@nokia.com>2011-08-19 09:16:12 +0200
commit9ebdc333a6a6485fd60a50a742a1d6edec211f53 (patch)
tree29f47352fac722f29bf3e394214b375977cdcea7 /src
parent64f94fa373900aca357f5f94c5ef16f481dc11b7 (diff)
Introduce a paged paintdevice and use it
Introduce a QPagedPaintDevice class that has a newPage() method and page dimensions. QPdfWriter and QPrinter inherit from it. Add a bit of API to QPdfWriter. Change-Id: Ibf23e7fe741f3a5ed854faf5d249a272acc75f35 Reviewed-on: http://codereview.qt.nokia.com/3206 Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/gui/painting/painting.pri2
-rw-r--r--src/gui/painting/qpagedpaintdevice.cpp203
-rw-r--r--src/gui/painting/qpagedpaintdevice.h42
-rw-r--r--src/gui/painting/qpdf.cpp12
-rw-r--r--src/gui/painting/qpdf_p.h5
-rw-r--r--src/gui/painting/qpdfwriter.cpp93
-rw-r--r--src/gui/painting/qpdfwriter.h15
-rw-r--r--src/gui/printsupport/qprintengine_pdf.cpp18
-rw-r--r--src/gui/printsupport/qprintengine_pdf_p.h2
-rw-r--r--src/gui/printsupport/qprinter.cpp88
-rw-r--r--src/gui/printsupport/qprinter.h14
-rw-r--r--src/widgets/dialogs/qpagesetupdialog_unix.cpp2
-rw-r--r--src/widgets/dialogs/qprintdialog_unix.cpp2
13 files changed, 409 insertions, 89 deletions
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index b12b2216a7..530bdb36df 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -11,6 +11,7 @@ HEADERS += \
painting/qmatrix.h \
painting/qmemrotate_p.h \
painting/qoutlinemapper_p.h \
+ painting/qpagedpaintdevice.h \
painting/qpaintdevice.h \
painting/qpaintengine.h \
painting/qpaintengine_p.h \
@@ -50,6 +51,7 @@ SOURCES += \
painting/qmatrix.cpp \
painting/qmemrotate.cpp \
painting/qoutlinemapper.cpp \
+ painting/qpagedpaintdevice.cpp \
painting/qpaintdevice.cpp \
painting/qpaintdevice_qpa.cpp \
painting/qpaintengine.cpp \
diff --git a/src/gui/painting/qpagedpaintdevice.cpp b/src/gui/painting/qpagedpaintdevice.cpp
new file mode 100644
index 0000000000..dd756db023
--- /dev/null
+++ b/src/gui/painting/qpagedpaintdevice.cpp
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qpagedpaintdevice.h>
+
+class QPagedPaintDevicePrivate
+{
+public:
+ QPagedPaintDevice::PageSize pageSize;
+ QSizeF pageSizeMM;
+};
+
+static const struct {
+ float width;
+ float height;
+} pageSizes[] = {
+ {210, 297}, // A4
+ {176, 250}, // B5
+ {215.9f, 279.4f}, // Letter
+ {215.9f, 355.6f}, // Legal
+ {190.5f, 254}, // Executive
+ {841, 1189}, // A0
+ {594, 841}, // A1
+ {420, 594}, // A2
+ {297, 420}, // A3
+ {148, 210}, // A5
+ {105, 148}, // A6
+ {74, 105}, // A7
+ {52, 74}, // A8
+ {37, 52}, // A8
+ {1000, 1414}, // B0
+ {707, 1000}, // B1
+ {31, 44}, // B10
+ {500, 707}, // B2
+ {353, 500}, // B3
+ {250, 353}, // B4
+ {125, 176}, // B6
+ {88, 125}, // B7
+ {62, 88}, // B8
+ {33, 62}, // B9
+ {163, 229}, // C5E
+ {105, 241}, // US Common
+ {110, 220}, // DLE
+ {210, 330}, // Folio
+ {431.8f, 279.4f}, // Ledger
+ {279.4f, 431.8f} // Tabloid
+};
+
+/*!
+ \class QPagedPaintDevice
+
+ \brief The QPagedPaintDevice class is a represents a paintdevice that supports
+ multiple pages.
+
+ \ingroup painting
+
+ Paged paint devices are used to generate output for printing or for formats like PDF.
+ QPdfWriter and QPrinter inherit from it.
+ */
+
+/*!
+ Constructs a new paged paint device.
+ */
+QPagedPaintDevice::QPagedPaintDevice()
+ : d(new QPagedPaintDevicePrivate)
+{
+ setPageSize(A4);
+}
+
+/*!
+ Destroys the object.
+ */
+QPagedPaintDevice::~QPagedPaintDevice()
+{
+ delete d;
+}
+
+/*!
+ \enum QPagedPaintDevice::PageSize
+
+ This enum type specifies the page size of the paint device.
+
+ \value A0 841 x 1189 mm
+ \value A1 594 x 841 mm
+ \value A2 420 x 594 mm
+ \value A3 297 x 420 mm
+ \value A4 210 x 297 mm, 8.26 x 11.69 inches
+ \value A5 148 x 210 mm
+ \value A6 105 x 148 mm
+ \value A7 74 x 105 mm
+ \value A8 52 x 74 mm
+ \value A9 37 x 52 mm
+ \value B0 1000 x 1414 mm
+ \value B1 707 x 1000 mm
+ \value B2 500 x 707 mm
+ \value B3 353 x 500 mm
+ \value B4 250 x 353 mm
+ \value B5 176 x 250 mm, 6.93 x 9.84 inches
+ \value B6 125 x 176 mm
+ \value B7 88 x 125 mm
+ \value B8 62 x 88 mm
+ \value B9 33 x 62 mm
+ \value B10 31 x 44 mm
+ \value C5E 163 x 229 mm
+ \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope
+ \value DLE 110 x 220 mm
+ \value Executive 7.5 x 10 inches, 190.5 x 254 mm
+ \value Folio 210 x 330 mm
+ \value Ledger 431.8 x 279.4 mm
+ \value Legal 8.5 x 14 inches, 215.9 x 355.6 mm
+ \value Letter 8.5 x 11 inches, 215.9 x 279.4 mm
+ \value Tabloid 279.4 x 431.8 mm
+ \value Custom Unknown, or a user defined size.
+
+ \omitvalue NPageSize
+
+ The page size can also be specified in millimeters using setPageSizeMM(). In this case the
+ page size enum is set to Custom.
+*/
+
+/*!
+ \fn bool QPagedPaintDevice::newPage()
+
+ Starts a new page.
+*/
+
+
+/*!
+ Sets the size of the a page to \a size.
+
+ \sa setPageSizeMM
+ */
+void QPagedPaintDevice::setPageSize(PageSize size)
+{
+ if (size >= Custom)
+ return;
+ d->pageSize = size;
+ d->pageSizeMM = QSizeF(pageSizes[A4].width, pageSizes[A4].height);
+}
+
+/*!
+ Returns the currently used page size.
+ */
+QPagedPaintDevice::PageSize QPagedPaintDevice::pageSize() const
+{
+ return d->pageSize;
+}
+
+/*!
+ Sets the page size to \a size. \a size is specified in millimeters.
+ */
+void QPagedPaintDevice::setPageSizeMM(const QSizeF &size)
+{
+ d->pageSize = Custom;
+ d->pageSizeMM = size;
+}
+
+/*!
+ Returns the page size in millimeters.
+ */
+QSizeF QPagedPaintDevice::pageSizeMM() const
+{
+ return d->pageSizeMM;
+}
+
diff --git a/src/gui/painting/qpagedpaintdevice.h b/src/gui/painting/qpagedpaintdevice.h
new file mode 100644
index 0000000000..faba555adf
--- /dev/null
+++ b/src/gui/painting/qpagedpaintdevice.h
@@ -0,0 +1,42 @@
+
+#ifndef QPAGEDPAINTDEVICE_H
+#define QPAGEDPAINTDEVICE_H
+
+#include <QtGui/qpaintdevice.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QPagedPaintDevicePrivate;
+
+class Q_GUI_EXPORT QPagedPaintDevice : public QPaintDevice
+{
+public:
+ QPagedPaintDevice();
+ ~QPagedPaintDevice();
+
+ virtual bool newPage() = 0;
+
+ enum PageSize { A4, B5, Letter, Legal, Executive,
+ A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1,
+ B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E,
+ DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom };
+
+ virtual void setPageSize(PageSize size);
+ PageSize pageSize() const;
+
+ virtual void setPageSizeMM(const QSizeF &size);
+ QSizeF pageSizeMM() const;
+
+private:
+ QPagedPaintDevicePrivate *d;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index dce3eec6fa..47687e4a53 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -1463,7 +1463,7 @@ int QPdfEngine::metric(QPaintDevice::PaintDeviceMetric metricType) const
QPdfEnginePrivate::QPdfEnginePrivate()
: clipEnabled(false), allClipped(false), hasPen(true), hasBrush(false), simplePen(false),
- outDevice(0), fd(-1),
+ outDevice(0), ownsDevice(false),
fullPage(false), embedFonts(true),
landscape(false),
grayscale(false),
@@ -1497,6 +1497,7 @@ bool QPdfEngine::begin(QPaintDevice *pdev)
} else {
return false;
}
+ d->ownsDevice = true;
}
d->postscript = false;
@@ -1543,15 +1544,8 @@ bool QPdfEngine::end()
delete d->currentPage;
d->currentPage = 0;
- if (d->outDevice) {
+ if (d->outDevice && d->ownsDevice) {
d->outDevice->close();
- if (d->fd >= 0)
- #if defined(Q_OS_WIN) && defined(_MSC_VER) && _MSC_VER >= 1400
- ::_close(d->fd);
- #else
- ::close(d->fd);
- #endif
- d->fd = -1;
delete d->outDevice;
d->outDevice = 0;
}
diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h
index b373fcec67..5aeb01effe 100644
--- a/src/gui/painting/qpdf_p.h
+++ b/src/gui/painting/qpdf_p.h
@@ -161,12 +161,13 @@ public:
private:
};
-
+class QPdfWriter;
class QPdfEnginePrivate;
class QPdfEngine : public QPaintEngine
{
Q_DECLARE_PRIVATE(QPdfEngine)
+ friend class QPdfWriter;
public:
QPdfEngine();
QPdfEngine(QPdfEnginePrivate &d);
@@ -266,7 +267,7 @@ public:
// the device the output is in the end streamed to.
QIODevice *outDevice;
- int fd;
+ bool ownsDevice;
// printer options
QString outputFileName;
diff --git a/src/gui/painting/qpdfwriter.cpp b/src/gui/painting/qpdfwriter.cpp
index 7faebd6e83..e36caf568f 100644
--- a/src/gui/painting/qpdfwriter.cpp
+++ b/src/gui/painting/qpdfwriter.cpp
@@ -64,6 +64,21 @@ public:
QFile *output;
};
+
+/*! \class QPdfWriter
+
+ \brief The QPdfWriter class is a class to generate PDFs
+ that can be used as a paint device.
+
+ \ingroup painting
+
+ QPdfWriter generates PDF out of a series of drawing commands using QPainter.
+ The newPage() method can be used to create several pages.
+ */
+
+/*!
+ Constructs a PDF writer that will write the pdf to \a filename.
+ */
QPdfWriter::QPdfWriter(const QString &filename)
: QObject(*new QPdfWriterPrivate)
{
@@ -72,20 +87,65 @@ QPdfWriter::QPdfWriter(const QString &filename)
d->engine->setOutputFilename(filename);
}
+/*!
+ Constructs a PDF writer that will write the pdf to \a device.
+ */
QPdfWriter::QPdfWriter(QIODevice *device)
: QObject(*new QPdfWriterPrivate)
{
Q_D(QPdfWriter);
- // ####
-// d->engine->setDevice(device);
+ d->engine->d_func()->outDevice = device;
}
+/*!
+ Destroys the pdf writer.
+ */
QPdfWriter::~QPdfWriter()
{
}
+/*!
+ Returns the title of the document.
+ */
+QString QPdfWriter::title() const
+{
+ Q_D(const QPdfWriter);
+ return d->engine->d_func()->title;
+}
+
+/*!
+ Sets the title of the document being created.
+ */
+void QPdfWriter::setTitle(const QString &title)
+{
+ Q_D(QPdfWriter);
+ d->engine->d_func()->title = title;
+}
+
+/*!
+ Returns the creator of the document.
+ */
+QString QPdfWriter::creator() const
+{
+ Q_D(const QPdfWriter);
+ return d->engine->d_func()->creator;
+}
+
+/*!
+ Sets the creator of the document.
+ */
+void QPdfWriter::setCreator(const QString &creator)
+{
+ Q_D(QPdfWriter);
+ d->engine->d_func()->creator = creator;
+}
+
+
+/*!
+ \reimp
+ */
QPaintEngine *QPdfWriter::paintEngine() const
{
Q_D(const QPdfWriter);
@@ -94,6 +154,28 @@ QPaintEngine *QPdfWriter::paintEngine() const
}
/*!
+ \reimp
+ */
+void QPdfWriter::setPageSize(PageSize size)
+{
+ Q_D(const QPdfWriter);
+
+ QPagedPaintDevice::setPageSize(size);
+ d->engine->d_func()->paperSize = pageSizeMM() * 25.4/72.;
+}
+
+/*!
+ \reimp
+ */
+void QPdfWriter::setPageSizeMM(const QSizeF &size)
+{
+ Q_D(const QPdfWriter);
+
+ QPagedPaintDevice::setPageSizeMM(size);
+ d->engine->d_func()->paperSize = pageSizeMM() * 25.4/72.;
+}
+
+/*!
\internal
Returns the metric for the given \a id.
@@ -104,9 +186,12 @@ int QPdfWriter::metric(PaintDeviceMetric id) const
return d->engine->metric(id);
}
-void QPdfWriter::newPage()
+/*!
+ \reimp
+*/
+bool QPdfWriter::newPage()
{
Q_D(QPdfWriter);
- d->engine->newPage();
+ return d->engine->newPage();
}
diff --git a/src/gui/painting/qpdfwriter.h b/src/gui/painting/qpdfwriter.h
index 4493e58f34..4e617aa617 100644
--- a/src/gui/painting/qpdfwriter.h
+++ b/src/gui/painting/qpdfwriter.h
@@ -43,7 +43,7 @@
#define QPDFWRITER_H
#include <QtCore/qobject.h>
-#include <QtCore/qiodevice.h>
+#include <QtGui/qpagedpaintdevice.h>
QT_BEGIN_HEADER
@@ -53,7 +53,7 @@ QT_MODULE(Gui)
class QPdfWriterPrivate;
-class Q_GUI_EXPORT QPdfWriter : public QObject, public QPaintDevice
+class Q_GUI_EXPORT QPdfWriter : public QObject, public QPagedPaintDevice
{
Q_OBJECT
public:
@@ -61,7 +61,16 @@ public:
QPdfWriter(QIODevice *device);
~QPdfWriter();
- void newPage();
+ QString title() const;
+ void setTitle(const QString &title);
+
+ QString creator() const;
+ void setCreator(const QString &creator);
+
+ bool newPage();
+
+ void setPageSize(PageSize size);
+ void setPageSizeMM(const QSizeF &size);
protected:
QPaintEngine *paintEngine() const;
diff --git a/src/gui/printsupport/qprintengine_pdf.cpp b/src/gui/printsupport/qprintengine_pdf.cpp
index df9a939e4b..1f4baf14f1 100644
--- a/src/gui/printsupport/qprintengine_pdf.cpp
+++ b/src/gui/printsupport/qprintengine_pdf.cpp
@@ -67,7 +67,7 @@ extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size);
#define Q_MM(n) int((n * 720 + 127) / 254)
#define Q_IN(n) int(n * 72)
-static const char * const psToStr[QPrinter::NPaperSize+1] =
+static const char * const psToStr[QPrinter::NPageSize+1] =
{
"A4", "B5", "Letter", "Legal", "Executive",
"A0", "A1", "A2", "A3", "A5", "A6", "A7", "A8", "A9", "B0", "B1",
@@ -526,6 +526,19 @@ bool QPdfPrintEnginePrivate::openPrintDevice()
void QPdfPrintEnginePrivate::closePrintDevice()
{
+ if (outDevice) {
+ outDevice->close();
+ if (fd >= 0)
+ #if defined(Q_OS_WIN) && defined(_MSC_VER) && _MSC_VER >= 1400
+ ::_close(fd);
+ #else
+ ::close(fd);
+ #endif
+ fd = -1;
+ delete outDevice;
+ outDevice = 0;
+ }
+
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (!cupsTempFile.isEmpty()) {
QString tempFile = cupsTempFile;
@@ -615,7 +628,8 @@ QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m)
copies(1),
pageOrder(QPrinter::FirstPageFirst),
paperSource(QPrinter::Auto),
- printerPaperSize(QPrinter::A4)
+ printerPaperSize(QPrinter::A4),
+ fd(-1)
{
resolution = 72;
if (m == QPrinter::HighResolution)
diff --git a/src/gui/printsupport/qprintengine_pdf_p.h b/src/gui/printsupport/qprintengine_pdf_p.h
index 367e3aebab..65e8428672 100644
--- a/src/gui/printsupport/qprintengine_pdf_p.h
+++ b/src/gui/printsupport/qprintengine_pdf_p.h
@@ -154,6 +154,8 @@ private:
QRect cupsPaperRect;
QRect cupsPageRect;
QSizeF customPaperSize; // in postscript points
+
+ int fd;
};
QT_END_NAMESPACE
diff --git a/src/gui/printsupport/qprinter.cpp b/src/gui/printsupport/qprinter.cpp
index bdbddf20c4..112f501e3f 100644
--- a/src/gui/printsupport/qprinter.cpp
+++ b/src/gui/printsupport/qprinter.cpp
@@ -393,47 +393,6 @@ void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey ke
*/
/*!
- \enum QPrinter::PageSize
-
- \obsolete
- Use QPrinter::PaperSize instead.
-
- \value A0 841 x 1189 mm
- \value A1 594 x 841 mm
- \value A2 420 x 594 mm
- \value A3 297 x 420 mm
- \value A4 210 x 297 mm, 8.26 x 11.69 inches
- \value A5 148 x 210 mm
- \value A6 105 x 148 mm
- \value A7 74 x 105 mm
- \value A8 52 x 74 mm
- \value A9 37 x 52 mm
- \value B0 1030 x 1456 mm
- \value B1 728 x 1030 mm
- \value B10 32 x 45 mm
- \value B2 515 x 728 mm
- \value B3 364 x 515 mm
- \value B4 257 x 364 mm
- \value B5 182 x 257 mm, 7.17 x 10.13 inches
- \value B6 128 x 182 mm
- \value B7 91 x 128 mm
- \value B8 64 x 91 mm
- \value B9 45 x 64 mm
- \value C5E 163 x 229 mm
- \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope
- \value DLE 110 x 220 mm
- \value Executive 7.5 x 10 inches, 191 x 254 mm
- \value Folio 210 x 330 mm
- \value Ledger 432 x 279 mm
- \value Legal 8.5 x 14 inches, 216 x 356 mm
- \value Letter 8.5 x 11 inches, 216 x 279 mm
- \value Tabloid 279 x 432 mm
- \value Custom Unknown, or a user defined size.
-
- \omitvalue NPageSize
- */
-
-/*!
\enum QPrinter::PaperSize
\since 4.4
@@ -591,7 +550,7 @@ void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey ke
Creates a new printer object with the given \a mode.
*/
QPrinter::QPrinter(PrinterMode mode)
- : QPaintDevice(),
+ : QPagedPaintDevice(),
d_ptr(new QPrinterPrivate(this))
{
init(mode);
@@ -611,7 +570,7 @@ QPrinter::QPrinter(PrinterMode mode)
Creates a new printer object with the given \a printer and \a mode.
*/
QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode)
- : QPaintDevice(),
+ : QPagedPaintDevice(),
d_ptr(new QPrinterPrivate(this))
{
init(mode);
@@ -1082,16 +1041,7 @@ QPrinter::PaperSize QPrinter::paperSize() const
*/
void QPrinter::setPaperSize(PaperSize newPaperSize)
{
- Q_D(QPrinter);
- if (d->paintEngine->type() != QPaintEngine::Pdf)
- ABORT_IF_ACTIVE("QPrinter::setPaperSize");
- if (newPaperSize < 0 || newPaperSize >= NPaperSize) {
- qWarning("QPrinter::setPaperSize: Illegal paper size %d", newPaperSize);
- return;
- }
- d->printEngine->setProperty(QPrintEngine::PPK_PaperSize, newPaperSize);
- d->addToManualSetList(QPrintEngine::PPK_PaperSize);
- d->hasUserSetPageSize = true;
+ setPageSize(newPaperSize);
}
/*!
@@ -1117,7 +1067,18 @@ QPrinter::PageSize QPrinter::pageSize() const
void QPrinter::setPageSize(PageSize newPageSize)
{
- setPaperSize(newPageSize);
+ QPagedPaintDevice::setPageSize(newPageSize);
+
+ Q_D(QPrinter);
+ if (d->paintEngine->type() != QPaintEngine::Pdf)
+ ABORT_IF_ACTIVE("QPrinter::setPaperSize");
+ if (newPageSize < 0 || newPageSize >= NPageSize) {
+ qWarning("QPrinter::setPaperSize: Illegal paper size %d", newPageSize);
+ return;
+ }
+ d->printEngine->setProperty(QPrintEngine::PPK_PaperSize, newPageSize);
+ d->addToManualSetList(QPrintEngine::PPK_PaperSize);
+ d->hasUserSetPageSize = true;
}
/*!
@@ -1134,8 +1095,21 @@ void QPrinter::setPaperSize(const QSizeF &paperSize, QPrinter::Unit unit)
if (d->paintEngine->type() != QPaintEngine::Pdf)
ABORT_IF_ACTIVE("QPrinter::setPaperSize");
const qreal multiplier = qt_multiplierForUnit(unit, resolution());
- QSizeF size(paperSize.width() * multiplier, paperSize.height() * multiplier);
- d->printEngine->setProperty(QPrintEngine::PPK_CustomPaperSize, size);
+ QSizeF size(paperSize.width() * multiplier * 25.4/72., paperSize.height() * multiplier * 25.4/72.);
+ setPageSizeMM(size);
+}
+
+/*!
+ \reimp
+ */
+void QPrinter::setPageSizeMM(const QSizeF &size)
+{
+ Q_D(QPrinter);
+
+ QPagedPaintDevice::setPageSizeMM(size);
+
+ QSizeF s = size * 72./25.4;
+ d->printEngine->setProperty(QPrintEngine::PPK_CustomPaperSize, s);
d->addToManualSetList(QPrintEngine::PPK_CustomPaperSize);
d->hasUserSetPageSize = true;
}
@@ -2263,7 +2237,7 @@ QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size)
*/
QPrinter::PaperSize qSizeFTopaperSize(const QSizeF& size)
{
- for (int i = 0; i < static_cast<int>(QPrinter::NPaperSize); ++i) {
+ for (int i = 0; i < static_cast<int>(QPrinter::NPageSize); ++i) {
if (qt_paperSizes[i][0] >= size.width() - 1 &&
qt_paperSizes[i][0] <= size.width() + 1 &&
qt_paperSizes[i][1] >= size.height() - 1 &&
diff --git a/src/gui/printsupport/qprinter.h b/src/gui/printsupport/qprinter.h
index d551489bb8..2f91c8b1e9 100644
--- a/src/gui/printsupport/qprinter.h
+++ b/src/gui/printsupport/qprinter.h
@@ -44,7 +44,7 @@
#include <QtCore/qstring.h>
#include <QtCore/qscopedpointer.h>
-#include <QtGui/qpaintdevice.h>
+#include <QtGui/qpagedpaintdevice.h>
QT_BEGIN_HEADER
@@ -63,7 +63,7 @@ class QPaintEngine;
class QPrintEngine;
class QPrinterInfo;
-class Q_GUI_EXPORT QPrinter : public QPaintDevice
+class Q_GUI_EXPORT QPrinter : public QPagedPaintDevice
{
Q_DECLARE_PRIVATE(QPrinter)
public:
@@ -78,16 +78,8 @@ public:
enum Orientation { Portrait, Landscape };
#ifndef Q_QDOC
- enum PageSize { A4, B5, Letter, Legal, Executive,
- A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1,
- B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E,
- DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom, NPaperSize = Custom };
typedef PageSize PaperSize;
#else
- enum PageSize { A4, B5, Letter, Legal, Executive,
- A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1,
- B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E,
- DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom };
enum PaperSize { A4, B5, Letter, Legal, Executive,
A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1,
B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E,
@@ -169,6 +161,8 @@ public:
void setPageSize(PageSize);
PageSize pageSize() const;
+ void setPageSizeMM(const QSizeF &size);
+
void setPaperSize(PaperSize);
PaperSize paperSize() const;
diff --git a/src/widgets/dialogs/qpagesetupdialog_unix.cpp b/src/widgets/dialogs/qpagesetupdialog_unix.cpp
index 192d833406..ff54e0a19b 100644
--- a/src/widgets/dialogs/qpagesetupdialog_unix.cpp
+++ b/src/widgets/dialogs/qpagesetupdialog_unix.cpp
@@ -367,7 +367,7 @@ void QPageSetupWidget::setupPrinter() const
QRect paperRect = m_cups->paperRect(cupsPageSize);
engine->setProperty(PPK_CupsPaperRect, paperRect);
- for(ps = 0; ps < QPrinter::NPaperSize; ++ps) {
+ for(ps = 0; ps < QPrinter::NPageSize; ++ps) {
QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps));
if (size.width == paperRect.width() && size.height == paperRect.height())
break;
diff --git a/src/widgets/dialogs/qprintdialog_unix.cpp b/src/widgets/dialogs/qprintdialog_unix.cpp
index 95619b9361..e1c1287a11 100644
--- a/src/widgets/dialogs/qprintdialog_unix.cpp
+++ b/src/widgets/dialogs/qprintdialog_unix.cpp
@@ -970,7 +970,7 @@ void QUnixPrintWidgetPrivate::setCupsProperties()
QRect paperRect = cups->paperRect(cupsPageSize);
engine->setProperty(PPK_CupsPaperRect, paperRect);
- for (int ps = 0; ps < QPrinter::NPaperSize; ++ps) {
+ for (int ps = 0; ps < QPrinter::NPageSize; ++ps) {
QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps));
if (size.width == paperRect.width() && size.height == paperRect.height())
printer->setPaperSize(static_cast<QPrinter::PaperSize>(ps));