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) {
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;

View File

@ -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;

View File

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

View File

@ -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;
}

View File

@ -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()
{