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

QtPy und QPrinter, ich komme einfach nicht weiter!

Beitragvon klaus66 » Sonntag 15. März 2009, 14:58

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: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 15. März 2009, 15:32

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.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 15. März 2009, 15:52

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

Beitragvon klaus66 » Montag 16. März 2009, 09:29

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

Ergänzug zu eben.

Beitragvon klaus66 » Montag 16. März 2009, 10:45

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: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Montag 16. März 2009, 11:02

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

Beitragvon lunar » Montag 16. März 2009, 11:31

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

Beitragvon klaus66 » Montag 16. März 2009, 12:28

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: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Montag 16. März 2009, 12:35

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

Beitragvon klaus66 » Montag 16. März 2009, 13:03

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

Beitragvon klaus66 » Montag 16. März 2009, 13:05

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

Beitragvon lunar » Montag 16. März 2009, 13:09

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

Beitragvon burli » Montag 16. März 2009, 13:16

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

Beitragvon klaus66 » Montag 16. März 2009, 13:26

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: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

Beitragvon snafu » Dienstag 17. März 2009, 00:22

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`. :)
shcol (Repo | Doc | PyPi)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder