Это действительно спрашивали некоторое время назад, но я взял код сверху, и мне потребовалось несколько часов, чтобы понять, что с ним не так.
Во-первых, глядя на исходный код Qt, я не смог найти ни одного места, которое предполагает 5% запас.
Qt правильно считывает поля из Windows XP, и вы можете полностью доверять полям страницы (Qt 4.5.3 с Windows XP).
Приведенный выше код содержит две проблемы: для печати бумажного документа необходимо установить параметр fullPage. Затем paperRect печатается по крайней мере на предварительном просмотре правильно. Конечно, не на реальном принтере, так как он находится за пределами страницы.
Как правило, печать paperRect не имеет смысла, так как при правильной печати она лежит точно на границе бумаги.
Вторая серьезная проблема связана с печатью pageRect без исправления источника.
Если fullPage отключен (по умолчанию), то источник pageRect находится в источнике paperRect, поэтому он включает поля.
Но печать начинается в QPoint (leftMargin, topMargin), поэтому поле добавляется дважды.
Чтобы решить эту проблему, необходимо вызвать pageRect.moveTo (0,0), а затем pageRect красиво напечатает, где он находится.
То, что разные принтеры показывают разные результаты, происходит с разных полей устройства. Только устройства с 0-полем будут работать с исходным кодом.