2009-05-27 1 views
1

Я следующий код печати:Печать pageRect и paperRect вопросы

void Print(QPrinter *printer) 
{ 
    QPainter q(printer); 
    q.setRenderHint(QPainter::HighQualityAntialiasing, true); 

    q.setPen(QPen(QColor("red"))); 
    q.drawRect(printer->pageRect()); 
    q.drawLine(printer->pageRect().topRight(), printer->pageRect().bottomLeft()); 

    q.setPen(QPen(QColor("blue"))); 
    q.drawRect(printer->paperRect()); 
    q.drawLine(printer->paperRect().topRight(), printer->paperRect().bottomLeft()); 
} 

Результат отличается от QPrintPreviewDialog, оказанной PDF, вывода на принтеры (HP LaserJet, PdfFactory, PDFCreator). В большинстве случаев результирующий прямоугольник отсутствует. Что делать, результат аналогичен всем принтерам?

+0

Какой QPrinter :: PrinterMode вы использовали для управления объектом принтера? –

ответ

1

Qt-код, который я рассмотрел, предполагает 5% бумаги в качестве маржи. Никто не доверяет правильной бумажной марже.

+0

QPrinter :: setFullPage() решил эту проблему в моем случае. – Fabian

3

Это действительно было задано некоторое время назад, но я взял код сверху, и мне стоило несколько часов выяснить, что с ним не так. Сначала, глядя на исходный код Qt, я не мог найти места, которое предполагает 5% -ный запас. Qt правильно считывает поля с Windows XP, и вы можете полностью доверять полям страниц (Qt 4.5.3 с Windows XP).

Код, указанный выше, содержит две проблемы: для печати на бумаге необходимо установить опцию fullPage. Затем paperRect печатается по крайней мере на предварительном просмотре. Конечно, не на реальном принтере, поскольку он находится за пределами pageRect. Как правило, печать paperRect не имеет смысла, поскольку при правильной печати оно находится именно на границе бумаги.

Вторая важная проблема связана с печатью страницыRect без исправления происхождения. Если fullPage отключен (по умолчанию), то начало pageRect лежит на источнике paperRect, поэтому оно включает поля. Но печать начинается с QPoint (leftMargin, topMargin), поэтому маржа добавляется дважды.

Чтобы устранить проблему, необходимо вызвать pageRect.moveTo (0,0), а затем pageRect красиво печатает, где она принадлежит.

То, что разные принтеры показывают разные результаты, поступает из разных полей устройства. С исходным кодом будут работать только устройства с 0-полями.

+0

Я имел в виду примеры Qt, включенные в Qt. – Pavels