Seite 1 von 1

drucken mit QWidget::render ?

Verfasst: 20. April 2010 15:01
von dschornae
Erstmal ein herzliches Hallo an alle ;)

Ich bin neu hier im Forum, weil ich trotz der guten Dokumentation gerade nicht weiter weiß und auf eure Erfahrung hoffe.

Folgende Unsicherheit:

Ich habe hier ein kleines Programm geschrieben, dass zur Erstellung von Rechnungen dient. Man kann es sich als angeordnetes Formular mit ein paar Zusatzfunktionen vorstellen. Einträge werden über Eingabefelder (QLineEdit) vorgenommen und wiederkehrende Informationen und ein Logo sind via Labels realisiert.
Die Rechnung soll dann auch gedruckt werden, was ich zunächst wie folgt gelöst habe:

Code: Alles auswählen

 QPixmap pix(widget->size());
    widget->render(&pix);
    QPrinter drucker(QPrinter::ScreenResolution);
    QPrintDialog printDialog(&drucker);
    if (printDialog.exec() == QDialog::Accepted) {
        QPainter painter;
        painter.begin(&drucker);
        painter.drawPixmap(0,0,pix);
        drucker.setPaperSize(drucker.A4);
        painter.end();
    }
Das Ergebnis ist allerdings von bescheidener Qualität (man merkt halt deutlich, dass hier "nur" ein Bild/Snapshot gedruckt wird.

Ich habe das "widget" auf Din A4 und 96 Dpi ausgelegt. Alle Positionsangaben für Labels und LineEdits sind dementsprechend in Pixel umgerechnet.
Wenn ich nun eine höhere Druckqualität haben möchte, wie müsste ich dann vorgehen?
Ist es ratsam, einfach einen höheren Dpi-Wert zu verwenden (z.B. 300)? Oder sollte ich anstelle von QWidget::render den Text aller Elemente auslesen und mit Hilfe von QPainter::drawText zeichnen lassen?
Oder ist am Ende sogar beides ratsam?

Falls ich den Dpi-Wert höher setze, wie würde sich das mit der Schriftgröße verhalten? Skaliert die dann dementsprechend mit? Müsste ich dann z.B. bei 192 Dpi nun eine Schriftgröße von 24 Bildpunkten nehmen, wenn ich vorher bei 96 eine Größe von 12 hatte? So würde ich es annehmen, aber vielleicht geht das auch einfacher und ich muss die Schriftgrößen nicht per Hand ändern?

Abschließend noch eine Frage zu Bildern. Ich lade in dem Programm ein Bild des jpg-Formats. Auf meinem PC funktioniert das ganze auch (wenn die nötigen Bibliotheken, die anfangs per Fehlermeldung beim Ausführen des Programms erscheinen, hinzugefügt wurden). Auf anderen Rechnern funktioniert das nicht. Auch wenn ich einen FileDialog einbaue kann das Bild nicht geladen werden. Fehlt da noch eine Bibliothek? Mit qjpeg4.dll hab ich es schon probiert, geht aber auch nicht.

So, ich hoffe mir kann geholfen werden ;)

Gruß,

dschornae

Verfasst: 20. April 2010 15:25
von franzf
QPrinter ist wie QPixmap ein QPaintDevice.
QWidget::render() verlangt entweder nen QPainter oder ein QPaintDevice.
Der logische Schluss sei dir überlassen.
Tip: Den QPainter brauchst du nicht unbedingt.
(Lösung: render() gleich auf dem QPrinter :P)

Verfasst: 20. April 2010 16:34
von dschornae
franzf hat geschrieben:QPrinter ist wie QPixmap ein QPaintDevice.
QWidget::render() verlangt entweder nen QPainter oder ein QPaintDevice.
Der logische Schluss sei dir überlassen.
Tip: Den QPainter brauchst du nicht unbedingt.
(Lösung: render() gleich auf dem QPrinter :P)
Danke für die Antwort. Ja in der Tat, da habe ich nicht genau hingeguckt. Dadurch kann man sich den Weg über Pixmap und Painter sparen.
Allerdings wird dadurch der Druck auch nicht ansehnlicher. Auf Papier sieht das ganze nicht gut aus.

Verfasst: 21. April 2010 12:06
von AlgorithMan
dschornae hat geschrieben: Allerdings wird dadurch der Druck auch nicht ansehnlicher. Auf Papier sieht das ganze nicht gut aus.
Ich würde mal tippen, dass es an dieser Zeile liegt

Code: Alles auswählen

QPrinter drucker(QPrinter::ScreenResolution); 
Das sieht mir doch so aus, als würdest Du die Bildschirm Auflösung auch für den Ausdruck nehmen... da wäre es wohl kein Wunder, wenn die Qualität gleich bliebe wie wenn du einen Bildschirminhalt druckst...

Verfasst: 21. April 2010 21:18
von dschornae
AlgorithMan hat geschrieben: Das sieht mir doch so aus, als würdest Du die Bildschirm Auflösung auch für den Ausdruck nehmen... da wäre es wohl kein Wunder, wenn die Qualität gleich bliebe wie wenn du einen Bildschirminhalt druckst...
Ja, ich verwende dieselbe "Auflösung". Es soll ja auf dem Papier genauso aussehen wie auf dem Bildschirm. Und auf dem Bildschirm sieht es gut aus. Wenn ich QWidget::render verwende, wird das Bild ja auch nur so groß, wie auf dem Bildschirm sichtbar.
Vergrößert man nun auf bspw 300 dpi, bleibt das Bild immer noch genauso groß und alles andere wird mit weiß aufgefüllt bzw auf den Bereich wird nicht gezeichnet.

Darum war ja meine Frage eingangs auch, ob ich mein Widget für 300 dpi auslegen sollte, um eine bessere Qualität zu erzielen. Oder ob es evt reicht, wenn ich nicht den "Snapshot" zeichnen lasse, sondern alle Texte der Eingabefelder und Labels mit QPainter::drawText zeichne.
Evt wird dies ja durch QWidget::render bereits so gemacht? Ich habe da keine Erfahrung und nicht genug Hintergrundwissen. Allerdings sieht der ganze Druck wie ein Snaptshot aus. Wenn man normalerweise Text (jetzt nicht in Qt, das habe ich nocht nicht probiert ;) )druckt, sieht das anders aus!