Seite 1 von 1

[gelöst] Drucken mit Qt4

Verfasst: 1. Dezember 2005 09:14
von michams
Hi,

Ich möchte ein paar Daten aus einer GUI auf den Drucker ausgeben und "zeichne" sie dazu mit QPainter auf einen QPrinter. Also zB

Code: Alles auswählen

QRect textRect(100, 100, 2500,100);
painter.drawText(textRect, Qt::AlignLeft, "Testdaten - Teil 1");
Klappt wunderbar, allerdings sehen die Ausdrucke auf diversern Druckern unterschiedlich aus (üblicherweise viel zu groß oder nur mit Lupe zu lesen). Anhand der Beispiele und der (in dem Bereich sehr kargen) Doku kann ich mir herleiten, daß ich das Koordinatensystem von Painter und Printer miteinander abgleichen muß. Nur welche Parameter müssen da wie angepaßt werden?

Workaround

Verfasst: 1. Dezember 2005 12:01
von cbrider
Das gleiche Problem habe ich auch.
Selbst wenn Du die Koordinatensysteme mit

[code]
painter.setWindow();
painter.setViewport();
[/code]

anpasst funktioniert es nicht richtig.

Als Workaround benutze ich ein PDFCreator-Prog. Dort passt das Layout recht gut. Die Qualität der Schrift etc. läßt jedoch zu wünschen übrig.

Gruß cbrider

Verfasst: 1. Dezember 2005 12:20
von michams
Bei PDF hab ich gerade gemerkt, daß die Drucker Resolution nicht mit der im Programm eingestellten übereingestimmt hat. Da hatte ich Qt:HighResolution eingestellt, was laut doku 600dpi sind, im PDF Creator waren aber 300 eingestellt. Wenn ich den PDF Creator auf 600dpi stelle, ist der Ausdruck auch ok. Das ist irgendwie blöd, da die eingestellte Resolution scheinbar nicht an den Druckertreiber weitergegeben wird, sondern nur zur Berechnung der internen Seitengröße bzw Punktanzahl dient, womit mir dann auch das Scaling klar wäre. Nur wie schafft man es jetzt, entweder die wirkliche eingestellte Auflösung des Druckers zu bekommen, oder andersherum, dem Drucker klarzumachen, welche Auflösung er drucken soll?

[EDIT] Gerade geschriebenes scheint nur für PDF-Treiber zu gelten. Ein "echter" Drucker nimmt schon die eingestellte Resolution. Dann kann man mit scale() auch den painter anpassen[/EDIT]

Verfasst: 1. Dezember 2005 12:29
von cbrider
Normalerweise mit

QPrinter printer(ScreenResolution);
printer.setResolution(600);

Laut doku ....
void QPrinter::setResolution(int dpi)

Verfasst: 1. Dezember 2005 17:41
von michams
GOT IT!!!

Mein elementarer Fehler bestand darin, das setResolution aufzurufen, bevor ich über den Druckerdialog den Drucker ausgewählt habe. Logischerweise muß das danach passieren, da dort zunächst die initiale Einstellung des Druckers übernommen wird (bei mir standard 1200dpi)!.
Allerdings scheinen je nach Rechner unterschiedliche Seitengrößen Anwendung zu finden. Auf Arbeit hab ich ein pageRect von 4800x6400 pixel bei 600dpi, zu Hause sind es nur ca 1500x2400. Das macht eine Skalierung zwingend erforderlich und zwar ausgehend von der Seitengröße, mit der man den painter programmiert hat. Das sieht folgendermaßen aus:

Code: Alles auswählen

...
QPrinter printer(QPrinter::HighResolution);

QPrintDialog *dlg = new QPrintDialog(&printer, this);
dlg->setWindowTitle("Print");

if(dlg->exec()!=QDialog::Accepted)
{   return; }

printer.setResolution(600);
    
QPainter painter;
painter.begin(&printer);
painter.save();

QRect pageRect = printer.pageRect();
double d_RatioX = ((double)pageRect.width()/4800);
double d_RatioY = ((double)pageRect.height()/6400);
painter.scale(d_RatioX, d_RatioY);

...
// hier wird gezeichnet...
Die 4800x6400 sind die Seitengröße, auf die ich gezeichnet habe. Das Scale paßt das Painter Objekt auf die wahre Seitengröße an, bein mir also ca 1/3