1

我有以下打印代码:

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)不同。大多数时候,生成的矩形没有纸。怎么做才能使输出与所有打印机相似?

4

2 回答 2

4

前段时间确实有人问过这个问题,但是我从上面获取了代码,我花了几个小时才弄清楚它有什么问题。首先,查看 Qt 源代码,我找不到任何假设 5% 保证金的地方。Qt 从 Windows XP 正确读取页边距,您可以完全信任页边距(Qt 4.5.3 with Windows XP)。

上面的代码包含两个问题:要打印 paperrect,必须设置 fullPage 选项。然后 paperRect 至少正确打印在预览上。当然不是在真正的打印机上,因为它在 pageRect 之外。通常,打印 paperRect 是没有意义的,因为如果打印正确,它就会正好位于纸张边框上。

第二个主要问题源于在没有更正原点的情况下打印 pageRect。如果 fullPage 被禁用(默认),则 pageRect 原点位于 paperRect 原点,因此包括边距。但是打印从 QPoint(leftMargin,topMargin) 开始,所以边距被添加了两次。

要解决此问题,需要调用 pageRect.moveTo(0,0),然后 pageRect 会在它所属的位置很好地打印。

不同的打印机显示不同的结果来自不同的设备边距。只有具有 0 边距的设备才能使用原始代码。

于 2010-06-08T18:39:01.083 回答
1

我查看的 Qt 代码假定 5% 的纸张作为它的边距。没有人相信正确的纸张页边距。

于 2009-10-09T13:00:43.940 回答