Qt 打印pageRect和paperRect问题

Qt 打印pageRect和paperRect问题,qt,printing,qprinter,Qt,Printing,Qprinter,我有以下打印代码: 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().topRigh

我有以下打印代码:

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)的结果不同。大多数情况下,生成的矩形没有纸。怎么做?输出与所有打印机相似?

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

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

这确实是一段时间前提出的问题,但我从上面获取了代码,花了我几个小时来找出它的问题所在。 首先,查看Qt源代码,我找不到任何假定有5%余量的地方。 Qt从Windows XP中正确读取页边距,您可以完全信任页边距(Windows XP中的Qt 4.5.3)

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

第二个主要问题来自打印pageRect而不更正来源。 如果禁用了fullPage(默认),则pageRect原点位于paperRect原点,因此包括页边距。 但是打印从QPoint(leftMargin,topMargin)开始,所以边距添加了两次

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


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

这确实是一段时间前提出的问题,但我从上面获取了代码,花了我几个小时来找出它的问题所在。 首先,查看Qt源代码,我找不到任何假定有5%余量的地方。 Qt从Windows XP中正确读取页边距,您可以完全信任页边距(Windows XP中的Qt 4.5.3)

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

第二个主要问题来自打印pageRect而不更正来源。 如果禁用了fullPage(默认),则pageRect原点位于paperRect原点,因此包括页边距。 但是打印从QPoint(leftMargin,topMargin)开始,所以边距添加了两次

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


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

您使用哪个QPrinter::PrinterMode构造打印机对象?您使用哪个QPrinter::PrinterMode构造打印机对象?我是指Qt中包含的Qt示例。我是指Qt中包含的Qt示例。QPrinter::setFullPage()中包含的Qt示例在我的案例中解决了这个问题。QPrinter::setFullPage()在我的案例中解决了这个问题。