QtPy und QPrinter, ich komme einfach nicht weiter!

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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:
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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....
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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
lunar

Es gibt "QPrinter.setPageMargins()", versuch das halt mal. Ansonsten kann ich aber nicht viel helfen, vom Drucken hab ich keine Ahnung ;)
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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?
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
lunar

Die Funktion gibt es erst seit Qt 4.4.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ubuntu 8.10 verwendet Qt4.4.
8.04 verwendet noch Qt4.3

http://packages.ubuntu.com/de/intrepid/pyqt4-dev-tools
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

Ich hab gerade mal nachgeschaut, ich verwnde Qt 4.4.3
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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`. :)
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

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.
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
lunar

Ein Update auf Qt 4.4 steht nicht zur Debatte?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ein Update auf Qt 4.4 steht nicht zur Debatte?
Er hat doch Qt 4.4.3?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
klaus66
User
Beiträge: 51
Registriert: Mittwoch 11. März 2009, 09:26
Wohnort: Bergisch Gladbach-Bensberg

So ist es!
Mit freundlichem Gruß Klaus

Das Geheimnis des Könnens liegt im Wollen!
Ubuntu 9.10 64Bit, AMD Athlon 64/Opteron 3200+, 1GB RAM, NVIDIA GeForce7, 250GB SATA 80GB USB und Asus Eee PC 4G mit Ubuntu-eee-8.04.1\\
lunar

klaus66 hat geschrieben:So ist es!
Warum verwendest du dann nicht .setPageMargins()?
Antworten