Seite 1 von 3

QtPy und QPrinter, ich komme einfach nicht weiter!

Verfasst: Sonntag 15. März 2009, 14:58
von klaus66
Seit Tagen, wenn nicht Wochen, komme ich immer wieder auf das Thema Qprinter zurück und versuche immer wieder irgendwo Hilfe zu bekommen, da mir alle Dokus, die ich irgendwo finde, nicht weiter helfen. :(
Inzwischen kann ich zwar fast alles drucken, aber nicht so wie ich es will!
Ich brauche einen Ausruck auf DINA5, das soll mit QPrinter::PageSize ja möglich sein. Aber wie sag ich es meinem Kinde in Python? No idea.
Desweiteren benötige ich eine Möglichkeit die Ränder des Druck-Dokumentes und den Schrifttyp und die Größe einzustellen. Meine zur Zeit benutzte Druckfunktion sieht wie Folgt aus:
  • def drucken(self, text):
    printer = QPrinter()
    printer.setFullPage(True)
    printer.setPaperSource(printer.Auto)
    printer = QPrinter(QPrinter.HighResolution)
    printer.setColorMode(QPrinter.Color)
    doc=QTextDocument(text)
    doc.print_(printer)
Alles nicht wirklich verstanden sondern irgendwo abgekupfert.
Sie druckt mit 1,5 cm breiten Ränder, was bei DINA5 nicht sehr sinnvoll ist.

Bitte verweist mich nicht auf die Qt-Doku! Die habe ich schon rauf und runter gelesen, ohne allzu großen Gewinn davon zu haben. Das Problem bei dieser Doku ist, dass es keine wirkliche Anleitung ist. Durch die ständigen Verweise springt man wild durch die ganze Doku, bis man nicht mehr weiß, was man eigentlich gesucht hat. :wink:
Findet man dann mal ein Druckerbeispiel, ist es in C++ geschrieben, das ich nur rudimentär ("Hello World) behersche und das mir damit nicht weiterhilft.
Für möglichst baldige Hilfe wäre ich sehr dankbar, da ich an dem Druckproblem zur zeit echt festhänge.

Verfasst: Sonntag 15. März 2009, 15:32
von snafu
Ohne mich jetzt näher mit den Aufrufen befasst zu haben, erscheint es etwas sinnfrei, zunächst `QPrinter()` an `printer` zu binden, davon zwei Methoden aufzurufen und das Objekt anschließend mit einer neuen `QPrinter()`-Klasse zu überschreiben. Dein abschließender `print_()`-Aufruf kann sich damit also nur auf das zweite `printer`-Exemplar beziehen, womit die ersten Zeilen letztlich keine Wirkung zeigen.

Verfasst: Sonntag 15. März 2009, 15:52
von snafu
Musterlösung:

Code: Alles auswählen

#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication, QPrinter, QTextDocument

app = QApplication(sys.argv)

printer = QPrinter()
printer.setPaperSize(QPrinter.A5)

doc = QTextDocument('Ich bin ein Text.')
doc.print_(printer)

app.exec_()
Siehe: http://doc.trolltech.com/4.4/qprinter.h ... rSize-enum

Verfasst: Montag 16. März 2009, 09:29
von klaus66
Hallo snafu,
vieln Dank für Deine Antwort und den Tip für "A5", das hat er jetzt gefressen. :)
Jetzt druckt er allerdings mit einem 5,5 cm Rand. Wenn ich mir das genauer anschaue, geht er offensichtlich davon aus, dass das DINA5 Blatt mittig angeodnet ist (wie bei HP, glaube ich üblich). Bei meinen Canon Druckern liegen die Blätter aber immer am rechten Anschlag. Da sitzt offensichtlich auch der Papiersensor!
Ich habe gerade mal mit einem DINA4 Blatt getestet. Dann erscheint der Druck genau mittig auf dem Blatt. Im Prinzip müsste es aber links oben in der Ecke gedruckt werden. Das Heißt "printer.setPaperSize(QPrinter.A5)" ist nicht die Lösung meines Problems. Zusätzlich brauche ich eine Möglichkeit die Druck-Ränder einzustellen bzw. den Ausdruck in die linke obere Ecke zu verschieben. Standardmäßig druckt er mit 1,5 cm Rand, Cannon kommt aber mit 0,5 cm aus, und den Platz, immerhin 2 cm brauche ich unbedingt auf dem Ausdruck.
Ich habe jetzt mit etlichen Einstellungen rumprobiert, finde aber nichts, was mir weiterhilft. Muß ich mir etwa einen HP-Drucker kaufen? :wink:

Ergänzug zu eben.

Verfasst: Montag 16. März 2009, 10:45
von klaus66
Das mit HP nehme ich zum Teil zurück. Ich habe jetzt mal das gleiche Programm auf unserem HP Officejet 5610 getestet. Und siehe da, der Ausdruck sitzt links oben in der Ecke mit 2cm Rand drum herum. Beim Canon Drucker sind das nach wie vor 5 cm Rand.
Ich will aber nur maximal 0,5 bis 1 cm spendieren!!
Zumindest werden jetzt schon mal zu lange Zeilen umbrochen, sodass kein Text verloren geht.
Meine Druckfunktion sieht jetzt so aus :
  • def drucken(self, text):
    printer = QPrinter()
    printer.setFullPage(True)
    printer.setPaperSize(QPrinter.A5)
    doc=QTextDocument(text)
    doc.print_(printer)
In der Hoffnung auf baldige Hilfe beim Verschieben des Ausdruckes....

Verfasst: Montag 16. März 2009, 11:02
von burli
Schau mal, ob es irgend sowas wie "Margin" gibt, mit dem du den Seitenrand einstellen kannst. Qt geht sicher von einem Standard Rand aus, wenn nichts anderes angegeben ist.

Die Ausrichtung im Drucker macht normalerweise der Druckertreiber, da nur der wissen kann ob ein DinA5 Blatt zentriert oder seitlich eingezogen wird. Sofern Der Treiber die richtige Angabe für die Papiergröße bekommt sollte er das Dokument auch automatisch richtig ausrichten

Verfasst: Montag 16. März 2009, 11:31
von lunar
Es gibt "QPrinter.setPageMargins()", versuch das halt mal. Ansonsten kann ich aber nicht viel helfen, vom Drucken hab ich keine Ahnung ;)

Verfasst: Montag 16. März 2009, 12:28
von klaus66
burli hat geschrieben:Schau mal, ob es irgend sowas wie "Margin" gibt, mit dem du den Seitenrand einstellen kannst. Qt geht sicher von einem Standard Rand aus, wenn nichts anderes angegeben ist.

Die Ausrichtung im Drucker macht normalerweise der Druckertreiber, da nur der wissen kann ob ein DinA5 Blatt zentriert oder seitlich eingezogen wird. Sofern Der Treiber die richtige Angabe für die Papiergröße bekommt sollte er das Dokument auch automatisch richtig ausrichten
Hallo burli,
der Tip mit "Margin" war gut. Dort finde ich in der Qt Hilfe folgendes:
  • For example, if you have code like
    uint rightMargin;
    uint bottomMargin;
    printer->margins(0, 0, &bottomMargin, &rightMargin);
    you can rewrite it as
    int rightMargin = printer->paperRect().right() - printer->pageRect().right();
    int bottomMargin = printer->paperRect().bottom() - printer->pageRect().bottom();
Das habe ich wie folgt abgewandelt (Python) :
  • papr = printer.paperRect().right()
    pagr = printer.pageRect().right()
    papb = printer.paperRect().bottom()
    pagb = printer.pageRect().bottom()
    print papr, papb, pagr, pagb
    Ergebnis:
    >>> 559 792 559 792
Vermutlich ist das DINA5 (148 x 210 mm) in Pixel. Danach würde sich in obigem Beispiel ein Rand von 0 mm ergeben, was die Berechnung natürlich auch ausspuckt. Beim Druck auf HP habe ich aber tatsächlich 20 mm, Canon 50mm.
Die Zeile printer.margins = .... wird 'mit unhandled AttributeError
"margins"' quittiert. Das heißt, ich kann Margins auch gar nicht setzen. Warum das?

Verfasst: Montag 16. März 2009, 12:35
von burli
Vermutlich holt Qt die Margins vom Druckertreiber, wenn nichts anderes angegeben wurde.

Ich gehe aber davon aus, das man die Margins auch irgendwie definieren kann

Verfasst: Montag 16. März 2009, 13:03
von klaus66
lunar hat geschrieben:Es gibt "QPrinter.setPageMargins()", versuch das halt mal. Ansonsten kann ich aber nicht viel helfen, vom Drucken hab ich keine Ahnung ;)
Hallo lunar,
es gibt folgendes :
  • void QPrinter::margins ( uint * top, uint * left, uint * bottom, uint * right ) const
    Sets *top, *left, *bottom, *right to be the top, left, bottom, and right margins.
    This function has been superseded by paperRect() and pageRect(). Use paperRect().top() - pageRect().top() for the top margin, paperRect().left() - pageRect().left() for the left margin, paperRect().bottom() - pageRect().bottom() for the bottom margin, and papaerRect().right() - pageRect().right() for the right margin.
    For example, if you have code like
    uint rightMargin;
    uint bottomMargin;
    printer->margins(0, 0, &bottomMargin, &rightMargin);
das die Margins des Printers setzen soll. Nur das Wörtchen 'margins' führt in Python in allen nur denkbaren Kombinationen immer zur Fehlermeldung "name 'margins' is not defined".
So dass ich hier auch nicht weiterkomme. :cry:
Trotzdem Danke für Deinen Hilfeversuch.

Verfasst: Montag 16. März 2009, 13:05
von klaus66
burli hat geschrieben:Vermutlich holt Qt die Margins vom Druckertreiber, wenn nichts anderes angegeben wurde.

Ich gehe aber davon aus, das man die Margins auch irgendwie definieren kann
Hallo burli,

zu dem Schluss komme ich langsam auch. Nur hilft mir das überhaupt, wenn alle Versuch, diese Einstellung zu ändern, scheitern.

Verfasst: Montag 16. März 2009, 13:09
von lunar
Die Funktion gibt es erst seit Qt 4.4.

Verfasst: Montag 16. März 2009, 13:16
von burli
Ubuntu 8.10 verwendet Qt4.4.
8.04 verwendet noch Qt4.3

http://packages.ubuntu.com/de/intrepid/pyqt4-dev-tools

Verfasst: Montag 16. März 2009, 13:26
von klaus66
Ich hab gerade mal nachgeschaut, ich verwnde Qt 4.4.3

Re: QtPy und QPrinter, ich komme einfach nicht weiter!

Verfasst: Dienstag 17. März 2009, 00:22
von snafu
klaus66 hat geschrieben:Findet man dann mal ein Druckerbeispiel, ist es in C++ geschrieben, das ich nur rudimentär ("Hello World) behersche und das mir damit nicht weiterhilft.
Dann installier dir doch das Paket `python-qt4-doc`. :)

Re: QtPy und QPrinter, ich komme einfach nicht weiter!

Verfasst: Dienstag 17. März 2009, 10:34
von klaus66
snafu hat geschrieben:
klaus66 hat geschrieben:Findet man dann mal ein Druckerbeispiel, ist es in C++ geschrieben, das ich nur rudimentär ("Hello World) behersche und das mir damit nicht weiterhilft.
Dann installier dir doch das Paket `python-qt4-doc`. :)
Hallo snafu,

Du hast natürlich vollkommen Recht.
Diese Doku befand sich auf meinem Rechner im Tiefschlaf. Ich hatte sie ganz am Anfang meiner Python-Zeit mal runtergeladen und dann zunächst als viel zu kompliziert, und für mich als Anfänger völlig unverständlich in einem Download-Ordner vergraben und dann völlig vergessen. :oops:
Dank Deines Tips hab ich sie heute wieder ausgegraben. Heute nach einigen Wochen Python-Praxis und dem Studium schlauer Bücher ist die Doku doch schon einigermaßen hilfreich für mich. Zumindest bin ich ein ganzes Stück weitergekommen.
An dieser Stelle möchte ich aus voller Überzeugung ein Lob auf Python anbringen. Dies ist die am schnellsten und effektivsten zu lernende Sprache, die ich in meinem langen Programmierer-Leben (43 Jahre) kennengelernt habe!!

Die richtige Positionierung meines A5 Dokumentes ist mir allerdings noch nicht gelungen. Also bleibe ich weiterhin für Vorschläge und Tips dankbar empfänglich.

Verfasst: Dienstag 17. März 2009, 11:06
von lunar
Ein Update auf Qt 4.4 steht nicht zur Debatte?

Verfasst: Dienstag 17. März 2009, 12:42
von Leonidas
lunar hat geschrieben:Ein Update auf Qt 4.4 steht nicht zur Debatte?
Er hat doch Qt 4.4.3?

Verfasst: Dienstag 17. März 2009, 12:44
von klaus66
So ist es!

Verfasst: Dienstag 17. März 2009, 12:47
von lunar
klaus66 hat geschrieben:So ist es!
Warum verwendest du dann nicht .setPageMargins()?