Pregunta

He siguiente código de impresión:

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());
}

El resultado es diferente con QPrintPreviewDialog, rendido PDF, salida a las impresoras (HP LaserJet, PdfFactory, PDFCreator). La mayor parte del tiempo el rectángulo resultante no tiene papel. ¿Qué hacer para que la salida es similar a todas las impresoras?

¿Fue útil?

Solución 2

El código Qt revisé supone el 5% de papel, ya que es el margen. Nadie se fía de los márgenes de papel correcto.

Otros consejos

Esto realmente se le preguntó hace algún tiempo, pero me tomó el código de arriba y me costó algunas horas de averiguar, lo que está mal con él. En primer lugar, mirar el código fuente de Qt, no pude encontrar ningún lugar que supone un margen del 5%. Qt vuelve a leer los márgenes correctamente desde Windows XP y se puede confiar completamente en los márgenes de la página (Qt 4.5.3 con Windows XP).

El código anterior contiene dos cuestiones: para imprimir un paperrect, la opción FullPage debe ajustarse. A continuación, el paperRect se imprime al menos en la vista previa correctamente. Por supuesto que no en una impresora real, ya que se encuentra fuera del pageRect. En general, la impresión de la paperRect no tiene sentido, ya que, si se imprime correctamente, se encuentra exactamente en el borde del papel.

El segundo problema importante se deriva de la impresión pageRect sin corregir el origen. Si FullPage está desactivado (por defecto), entonces el origen pageRect está en el origen paperRect tanto, incluye los márgenes. Sin embargo, la impresión comienza en QPoint (leftMargin, topmargin), por lo que se añade el margen de dos veces.

Para solucionar el problema, pageRect.moveTo (0,0) tiene que ser llamado y luego las impresiones pageRect muy bien a donde pertenece.

Eso diferentes impresoras muestran diferentes resultados proviene de diferentes márgenes de dispositivos. Sólo los dispositivos con 0 margen trabajarán con el código original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top