Seite 1 von 1

QPrinter/QPainter: Millimetergenaues drucken

Verfasst: 16. Juni 2010 09:42
von paulreuter
Hallo zusammen,

ich möchte gerne Zeichenobjekte (Linien, Kreise, Rechtecke) millimetergenau auf ein Papier drucken. Problem ist jedoch, das QPainter erstmal mit Pixeln arbeitet.

Hier ein Schnipsel Test-Code, mit dem ich bislang mein PDF erzeuge. Was kann ich tun, damit ich QPainter die "druckfertigen" Millimeter-Angaben zur Objektplazierung und Objketgröße mitteilen kann?

Code: Alles auswählen

    QPrinter printer;
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setDuplex(QPrinter::DuplexNone);
    printer.setOrientation(QPrinter::Landscape);
    printer.setPaperSize(QPrinter::A4);
    printer.setOutputFileName("test.pdf");

    QPainter painter;
    if (! painter.begin(&printer)) {
        // failed to open file
    }
    painter.drawRect(50, 50, 100, 100);

    painter.end();

Schonmal danke & viele Grüße

Paul

Verfasst: 15. Februar 2011 23:53
von odt
Hmm, ist schon eine Weile her, aber ich bin heute über das gleiche Problemchen gestolpert. Der QPrinter als QPaintDevice liefert Dir mit widthMM() die Breite der Seite in mm. Über width() ist dann der Umrechnungsfaktor schnell berechnet:

Code: Alles auswählen

cmToPixelFactor.setX( ((qreal)printer.width() ) * 10.0 / ((qreal)printer.widthMM() ) );
cmToPixelFactor.setY( ((qreal)printer.height()) * 10.0 / ((qreal)printer.heightMM()) );
Zwar könnte man nun den QPainter transformieren (skalieren), was sich aber möglicherweise auf die Fonts auswirken könnte. Darum rechne ich meine cm-Werte vor dem Zeichnen in Pixel um.

Code: Alles auswählen

QPointF DocPageFragment::cmToPixel( const QPointF& cm ){
	return QPointF( cm.x() * _cmToPixelFactor.x(), cm.y() * _cmToPixelFactor.y() );
}
Viele Grüsse, Reto