Only use the user set page margins for custom paper

When the QPrinter is initalized then it will set up page margins based
on the default paper size. If the paper size is changed to be a custom
one then it should disregard the margins for the default paper size.

If the page margins are set explicitly beforehand then it will use these
page margins.

Change-Id: Ic535c3a80b8b217dbd5eb5f4fb2cbc0ab1354563
Reviewed-by: Titta Heikkala <titta.heikkala@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
This commit is contained in:
Andy Shaw 2012-10-25 06:43:01 +02:00 committed by The Qt Project
parent bf722c1ab3
commit 50ec06da2c
5 changed files with 80 additions and 10 deletions

View File

@ -795,13 +795,15 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
if (d->hasCustomPageMargins) { if (d->hasCustomPageMargins) {
margins << d->leftMargin << d->topMargin margins << d->leftMargin << d->topMargin
<< d->rightMargin << d->bottomMargin; << d->rightMargin << d->bottomMargin;
} else { } else if (!d->hasCustomPaperSize) {
PMPaperMargins paperMargins; PMPaperMargins paperMargins;
PMPaper paper; PMPaper paper;
PMGetPageFormatPaper(d->format(), &paper); PMGetPageFormatPaper(d->format(), &paper);
PMPaperGetMargins(paper, &paperMargins); PMPaperGetMargins(paper, &paperMargins);
margins << paperMargins.left << paperMargins.top margins << paperMargins.left << paperMargins.top
<< paperMargins.right << paperMargins.bottom; << paperMargins.right << paperMargins.bottom;
} else {
margins << 0 << 0 << 0 << 0;
} }
ret = margins; ret = margins;
break; break;

View File

@ -213,6 +213,7 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
d->topMargin = margins.at(1).toReal(); d->topMargin = margins.at(1).toReal();
d->rightMargin = margins.at(2).toReal(); d->rightMargin = margins.at(2).toReal();
d->bottomMargin = margins.at(3).toReal(); d->bottomMargin = margins.at(3).toReal();
d->pageMarginsSet = true;
break; break;
} }
default: default:
@ -298,8 +299,11 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const
case PPK_PageMargins: case PPK_PageMargins:
{ {
QList<QVariant> margins; QList<QVariant> margins;
margins << d->leftMargin << d->topMargin if (d->printerPaperSize == QPrinter::Custom && !d->pageMarginsSet)
<< d->rightMargin << d->bottomMargin; margins << 0 << 0 << 0 << 0;
else
margins << d->leftMargin << d->topMargin
<< d->rightMargin << d->bottomMargin;
ret = margins; ret = margins;
break; break;
} }
@ -353,6 +357,7 @@ QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m)
pageOrder(QPrinter::FirstPageFirst), pageOrder(QPrinter::FirstPageFirst),
paperSource(QPrinter::Auto), paperSource(QPrinter::Auto),
printerPaperSize(QPrinter::A4), printerPaperSize(QPrinter::A4),
pageMarginsSet(false),
fd(-1) fd(-1)
{ {
resolution = 72; resolution = 72;

View File

@ -151,7 +151,7 @@ private:
QPrinter::PaperSize printerPaperSize; QPrinter::PaperSize printerPaperSize;
QSizeF customPaperSize; // in postscript points QSizeF customPaperSize; // in postscript points
bool pageMarginsSet;
int fd; int fd;
}; };

View File

@ -1540,13 +1540,17 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
case PPK_PageMargins: case PPK_PageMargins:
{ {
QList<QVariant> margins; 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 // specified in 1/100 mm
margins << (mmToInches(pageMargins.left()/100.0) * 72) margins << (mmToInches(pageMargins.left()/100.0) * 72)
<< (mmToInches(pageMargins.top()/100.0) * 72) << (mmToInches(pageMargins.top()/100.0) * 72)
<< (mmToInches(pageMargins.width()/100.0) * 72) << (mmToInches(pageMargins.width()/100.0) * 72)
<< (mmToInches(pageMargins.height()/100.0) * 72); << (mmToInches(pageMargins.height()/100.0) * 72);
}
value = margins; value = margins;
break; break;
} }

View File

@ -109,6 +109,8 @@ private slots:
void valuePreservation(); void valuePreservation();
void errorReporting(); void errorReporting();
void testCustomPageSizes(); void testCustomPageSizes();
void customPaperSizeAndMargins_data();
void customPaperSizeAndMargins();
#if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG) #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG)
void printDialogCompleter(); void printDialogCompleter();
#endif #endif
@ -933,6 +935,63 @@ void tst_QPrinter::testCustomPageSizes()
QCOMPARE(paperSize, customSize); 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) #if !defined(QT_NO_COMPLETER) && !defined(QT_NO_FILEDIALOG)
void tst_QPrinter::printDialogCompleter() void tst_QPrinter::printDialogCompleter()
{ {