Проблемы с исправлением страницы и бумаги при печати

StackOverflow https://stackoverflow.com/questions/915775

  •  06-09-2019
  •  | 
  •  

Вопрос

У меня есть следующий код печати:

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).Большую часть времени получающийся прямоугольник делается из бумаги.Что сделать, чтобы выходные данные были одинаковыми для всех принтеров?

Это было полезно?

Решение 2

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top