Seite 1 von 1

Bug im Qt4.5 Druckdialog?

Verfasst: 9. April 2009 11:01
von burli
Hi, nach langer Abwesenheit habe ich endlich wieder den Weg hier her gefunden. Ich habe mir mit PyQt ein kleines Script gebastelt, das einen Drucker auswählt, breite, höhe und Margins der Seite einstellt und dann den Druckerdialog öffnet.

Wenn ich mir dann im Dialog die Zahlen anschaue stimmen die vorne und hinten nicht. Ich gebe eine Breite von 57mm an (Label Drucker) und im Dialog stehen über 1000mm. Bei den anderen Zahlen ist es ähnlich. Der Ausdruck funktioniert dann aber problemlos. Der Bug scheint erst mit Qt4.5 aufzutreten, unter Qt4.4 soll das alles funktioniert haben

Hier ein Screenshot wie das dann aussieht

Außerdem ignoriert er die Angabe, wie viele Seiten gedruckt werden sollen. Er druckt immer nur eine Seite aus.

Jetzt ist die Frage, ob es ähnliche Probleme auch unter C++ gibt. Ich bin erst am lernen und konnte es noch nicht testen

Ich verwende hier Xubuntu Jaunty mit Qt5.4 und Python 2.6. Auf der Trolltech Seite habe ich irgendwo gelesen, das es wohl unter unixoiden Systemen irgendwelche Probleme mit setNumCopies() zu geben scheint.

Verfasst: 9. April 2009 16:16
von Xairo
Hi,

Laut Trolltech ist der Bug in der Version 4.5 gefixt.
Man könnte es ja mit C++ umsetzen, um zu gucken ob es an PyQt liegt.
https://www.qtsoftware.com/developer/ta ... &id=230372

Verfasst: 9. April 2009 18:03
von burli
Xairo hat geschrieben:Laut Trolltech ist der Bug in der Version 4.5 gefixt.
Ja, das hab ich auch gefunden. Deshalb hab ich keinen neuen Bug Report auf gemacht.
Xairo hat geschrieben:Man könnte es ja mit C++ umsetzen, um zu gucken ob es an PyQt liegt.
Ja, wie gesagt, C++ lerne ich gerade. Bzw ich lerne, wie Qt und C++ zusammengehören. Vielleicht schaff ich es dieses Wochenende, ein Equivalent in C++ zu schreiben

Verfasst: 11. April 2009 13:04
von burli
Scheint wohl doch an den PyQt Bindings zu liegen. Zumindest kommen die korrekten Margins im Dialog an und in Properties/Advanced wird, im Gegensatz zu PyQt, etwas angezeigt.

Was nicht funktioniert ist setPaperSize. Vielleicht habe ich etwas falsch verstanden

Code: Alles auswählen

printer.setPaperSize(QSizeF(32.0, 57.0), QPrinter::Millimeter);
Was auch nicht funktioniert ist printer.setNumCopies(). Ich kann da zwar 10 Stück anzeigen und die erscheinen auch im Druckerdialog, aber trotzdem druckt er nur ein Exemplar.

Ich muss aber auch gestehen, das ich noch kein C++ Experte bin. Ich weiß zb nie, ob ich jetzt einfach QPrinter printer; verwenden kann oder QPrinter *printer = new .... verwenden muss.

In der Doku zu QPrintDialog steht zb

Code: Alles auswählen

[i]QPrintDialog printDialog(printer, parent);[/i]
Ich musste aber

Code: Alles auswählen

QPrintDialog *dlg = new QPrintDialog(&printer, this);
schreiben, damit es funktioniert. Kann mir jemand mal eine gute Seite mit einem C++ Tutorial nennen, das sowas näher erläutert? Oder vielleicht kurz in 1-2 Sätzen mal erklären? Ich hab mir zwar den C++ Primer bestellt, aber der Laden hat die Bestellung verbummelt und deshalb ging das Buch erst Donnerstag raus. Dabei wollte ich über Ostern lesen. :cry: Mit viel Glück kommt es heute

EDIT: Ich habe gerade festgestellt, das QPrintDialog printDialog(&printer, parent); funktioniert. Ist das jetzt ein Fehler in der Qt Doku?

Verfasst: 11. April 2009 16:32
von Xairo
Wäre schade, wenn es wirklich an PyQt liegt. Aber mit C++ scheint es wohl nicht viel besser zu sein. :-)
Vielleicht nochmal die Python Version auf einem anderen Rechner ausprobieren.

Nein, das Ganze ist kein Fehler.

1.

Code: Alles auswählen

QPrinter printer;
QPrintDialog printDialog(&printer, parent);
Oder

2.

Code: Alles auswählen

QPrinter* printer = new QPrinter();
QPrintDialog printDialog(printer, parent);
Beides ist korrekt.

Code: Alles auswählen

QPrintDialog ( QPrinter * printer, QWidget * parent = 0 )
QPrintDialog will als erstes Argument die Adresse vom QPrinter wissen. Bei Version 1 muss ein & hin, da du QPrinter nicht als Zeiger angelegt hast. Bei Version 2 braucht man das & nicht, da liegt QPrinter als Zeiger vor, und printer liefert dir auch direkt seine Adresse.

& (address of) - gibt dir die Adresse einer Variable zurück.

Naja, aber das muss man üben.
http://www.hs-augsburg.de/~sandman/c_vo ... #Xxx999328

Der Unterschied ist, alles was du mit new erzeugst musst du mit delete auch löschen.
Beim anderen (QPrinter printer), das ist auf seine Lokalität beschränkt und nach Ende des Blocks automatisch gelöscht.

MfG
Xairo

Verfasst: 11. April 2009 16:40
von burli
Xairo hat geschrieben:Nein, das Ganze ist kein Fehler.
Es ist zumindest verwirrent weil an der einen Stelle eine Variable von QPrinter erzeugt wird und an anderer Stelle QPrintDialog ebenfalls als Variable erzeugt wird, aber printer ohne den & Operator verwendet.

So langsam blicke ich aber durch und beiße mich Stück für Stück weiter. Außerdem sind eben zwei Bücher gekommen. C++ Primer und C++ GUI Programmierung mit Qt4. Jetzt hilft nur noch lesen und ausprobieren ausprobieren ausprobieren :)