diff options
-rw-r--r-- | src/plugins/platforms/cocoa/qprintengine_mac.mm | 4 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintengine_pdf.cpp | 9 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintengine_pdf_p.h | 2 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintengine_win.cpp | 16 | ||||
-rw-r--r-- | tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp | 59 |
5 files changed, 80 insertions, 10 deletions
diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm index f2c567f0eb..94c89ad8db 100644 --- a/src/plugins/platforms/cocoa/qprintengine_mac.mm +++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm @@ -795,13 +795,15 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const if (d->hasCustomPageMargins) { margins << d->leftMargin << d->topMargin << d->rightMargin << d->bottomMargin; - } else { + } else if (!d->hasCustomPaperSize) { PMPaperMargins paperMargins; PMPaper paper; PMGetPageFormatPaper(d->format(), &paper); PMPaperGetMargins(paper, &paperMargins); margins << paperMargins.left << paperMargins.top << paperMargins.right << paperMargins.bottom; + } else { + margins << 0 << 0 << 0 << 0; } ret = margins; break; diff --git a/src/printsupport/kernel/qprintengine_pdf.cpp b/src/printsupport/kernel/qprintengine_pdf.cpp index 3e343176ba..c4bcb697f5 100644 --- a/src/printsupport/kernel/qprintengine_pdf.cpp +++ b/src/printsupport/kernel/qprintengine_pdf.cpp @@ -213,6 +213,7 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va d->topMargin = margins.at(1).toReal(); d->rightMargin = margins.at(2).toReal(); d->bottomMargin = margins.at(3).toReal(); + d->pageMarginsSet = true; break; } default: @@ -298,8 +299,11 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const case PPK_PageMargins: { QList<QVariant> margins; - margins << d->leftMargin << d->topMargin - << d->rightMargin << d->bottomMargin; + if (d->printerPaperSize == QPrinter::Custom && !d->pageMarginsSet) + margins << 0 << 0 << 0 << 0; + else + margins << d->leftMargin << d->topMargin + << d->rightMargin << d->bottomMargin; ret = margins; break; } @@ -353,6 +357,7 @@ QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m) pageOrder(QPrinter::FirstPageFirst), paperSource(QPrinter::Auto), printerPaperSize(QPrinter::A4), + pageMarginsSet(false), fd(-1) { resolution = 72; diff --git a/src/printsupport/kernel/qprintengine_pdf_p.h b/src/printsupport/kernel/qprintengine_pdf_p.h index 36df233f72..2d70c4619e 100644 --- a/src/printsupport/kernel/qprintengine_pdf_p.h +++ b/src/printsupport/kernel/qprintengine_pdf_p.h @@ -151,7 +151,7 @@ private: QPrinter::PaperSize printerPaperSize; QSizeF customPaperSize; // in postscript points - + bool pageMarginsSet; int fd; }; diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 28e0363d6e..200b5fd102 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -1540,13 +1540,17 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const case PPK_PageMargins: { QList<QVariant> margins; - QRect pageMargins(d->getPageMargins()); + if (d->has_custom_paper_size && !d->pageMarginsSet) { + margins << 0 << 0 << 0 << 0; + } else { + QRect pageMargins(d->getPageMargins()); - // specified in 1/100 mm - margins << (mmToInches(pageMargins.left()/100.0) * 72) - << (mmToInches(pageMargins.top()/100.0) * 72) - << (mmToInches(pageMargins.width()/100.0) * 72) - << (mmToInches(pageMargins.height()/100.0) * 72); + // specified in 1/100 mm + margins << (mmToInches(pageMargins.left()/100.0) * 72) + << (mmToInches(pageMargins.top()/100.0) * 72) + << (mmToInches(pageMargins.width()/100.0) * 72) + << (mmToInches(pageMargins.height()/100.0) * 72); + } value = margins; break; } diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp index 0f7c7f7a84..b01f311f4f 100644 --- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp +++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp @@ -109,6 +109,8 @@ private slots: void valuePreservation(); void errorReporting(); void testCustomPageSizes(); + void customPaperSizeAndMargins_data(); + void customPaperSizeAndMargins(); #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG) void printDialogCompleter(); #endif @@ -933,6 +935,63 @@ void tst_QPrinter::testCustomPageSizes() QCOMPARE(paperSize, customSize); } +void tst_QPrinter::customPaperSizeAndMargins_data() +{ + QTest::addColumn<bool>("pdf"); + QTest::addColumn<bool>("before"); + QTest::addColumn<qreal>("left"); + QTest::addColumn<qreal>("top"); + QTest::addColumn<qreal>("right"); + QTest::addColumn<qreal>("bottom"); + + QTest::newRow("beforeNoPDF") << false << true << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("beforePDF") << true << true << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("afterNoPDF") << false << false << qreal(2) << qreal(2) << qreal(2) << qreal(2); + QTest::newRow("afterAfterPDF") << true << false << qreal(2) << qreal(2) << qreal(2) << qreal(2); +} + +void tst_QPrinter::customPaperSizeAndMargins() +{ + QFETCH(bool, pdf); + QFETCH(bool, before); + QFETCH(qreal, left); + QFETCH(qreal, top); + QFETCH(qreal, right); + QFETCH(qreal, bottom); + + qreal tolerance = 0.05; + qreal getLeft = 0; + qreal getRight = 0; + qreal getTop = 0; + qreal getBottom = 0; + QSizeF customSize(8.5, 11.0); + + QPrinter p; + if (pdf) + p.setOutputFormat(QPrinter::PdfFormat); + if (before) + p.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); + p.setPaperSize(customSize, QPrinter::Millimeter); + p.getPageMargins(&getLeft, &getTop, &getRight, &getBottom, QPrinter::Millimeter); + if (before) { + QVERIFY(fabs(left - getLeft) < tolerance); + QVERIFY(fabs(left - getTop) < tolerance); + QVERIFY(fabs(left - getRight) < tolerance); + QVERIFY(fabs(left - getBottom) < tolerance); + } else { + QVERIFY(getLeft == 0); + QVERIFY(getTop == 0); + QVERIFY(getRight == 0); + QVERIFY(getBottom == 0); + p.setPageMargins(left, top, right, bottom, QPrinter::Millimeter); + p.getPageMargins(&getLeft, &getTop, &getRight, &getBottom, QPrinter::Millimeter); + QVERIFY(fabs(left - getLeft) < tolerance); + QVERIFY(fabs(left - getTop) < tolerance); + QVERIFY(fabs(left - getRight) < tolerance); + QVERIFY(fabs(left - getBottom) < tolerance); + } +} + #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG) void tst_QPrinter::printDialogCompleter() { |