Seite 1 von 1

QPrinter mal wieder...

Verfasst: 25. Juli 2007 15:56
von C_R
Hallo,

ich brauch hier mal wieder etwas Hilfe..
ich möchte eine QPixmap drucken. Auf Linux funktioniert das alles auch soweit ganz gut. Auf Windows steigt mir das Program bei printer->newPage(); aus - aber eben nur in windows... Hier mal der Code:
void Plotter::printExtended()
{ // used to print only this plot (via print button on the plot)

QPrinter *printer = new QPrinter(QPrinter::PrinterResolution);
printer->setPageSize(QPrinter::A4);
printer->setFullPage(true);
printer->setResolution(600);
printer->setCreator("Satellite Prediction Tool");
printer->setDocName( plotLabel->text());
printer->setOrientation(QPrinter::Landscape);

QPrintDialog printDialog(printer);
if (printDialog.exec() == QDialog::Accepted) {
print(printer);
}
}


void Plotter::print(QPrinter * extPrinter)
{ // used to print the plot to pdf (batch-print)

QPrinter *printer;

if (extPrinter == 0) {
printer = new QPrinter(QPrinter::PrinterResolution);
...
} else {
printer = extPrinter;
}// if

isPrint = true; // invert colors & change sizes.

// create pixmap -> printable data
printer->newPage();
...
Es liegt also wohl an den Pointern (?). Kann auch sein, dass es ein einfacher C-Fehler ist, den ich gerade nicht sehe.. Es könnte allerdings auch am PrinterDialog liegen..
wäre dankbar für jede Hilfe :)

greets
chris

Verfasst: 26. Juli 2007 14:12
von C_R
nagut, wisst ihr nicht? :) könnt ihr mir sagen, auf welche weise ihr bilder/pixmaps scaled, sodass sie auf das papier passen? meine passen unter linux aber unter windows sind sie größer als das papier. hab schon einige sachen probiert, aber erziele kein einheitliches ergebnis..

Verfasst: 26. Juli 2007 14:22
von Christian81
Das einzige was ich nicht sehe, ist wo extPrinter und wo Du printer wieder löschst -> dort darfst Du ja extPrinter nicht wieder löschen.

Verfasst: 26. Juli 2007 14:33
von C_R
sorry, verstehe nicht, was du meinst. kannst du es nochmal anders ausdrücken? extPrinter wird bei mir nicht gelöscht.

der initialwert von extPrinter ist 0 (void print(QPrinter * extPrinter = 0))

wenn ich also diese fkt. ohne den ext.printer-pointer aufrufe, wird ein neuer printer generiert, anderenfalls wird der printer-pointer auf ext.printer gesetzt.

Verfasst: 26. Juli 2007 14:38
von Christian81
Ich sehe nirgends wo

QPrinter *printer = new QPrinter(QPrinter::PrinterResolution);

wieder freigegeben wird...

Verfasst: 26. Juli 2007 14:58
von C_R
sorry, die wohl dumme frage, aber was macht das für einen unterschied?

Verfasst: 26. Juli 2007 15:00
von Christian81
Also ich würde mal sagen Du solltest dich mit mal mit den Grundlagen beschöftigen... ein Pointer den man mit new() erzeugt hat, sollte man normalerweise auch mit delete wieder freigeben. Sonst gibts memleaks...
Die Ausnahmen sind alle Klassen, die von QObject abgeleitet sind und denen Du ein parent übergibst.

Verfasst: 26. Juli 2007 15:07
von C_R
Ja eben, alle Q_OBJECTS, die in einem anderen Q_OBJECT erzeugt werden, werden beim zerstören des in der Hierarchie höherliegenden ebenfalls zerstört. Soweit ich das jetzt verstanden habe. Dabei müssen diese auch nicht unbedingt den Parent übergeben bekommen - oder doch?

Verfasst: 26. Juli 2007 15:13
von Christian81
Wie sollen die Objekte ohne parent irgend eine Referenz untereinander aufbauen können?
Und wie sinnvoll ist es zig QPrinter zu erzeugen ohne sie wieder zu löschen? Da würde sich wohl eher eine member-Variable lohnen...

Verfasst: 27. Juli 2007 08:44
von C_R
Ok, dann muss ich wohl meinen Code nochmal in der Hinsicht überarbeiten. Es wird stets nur ein QPrinter erzeugt. Der wird eben wiederverwendet, darum ja das ganze. Existiert ein Printer schon, wird dieser beim Funktionsaufruf übergeben. Als Member macht das keinen Sinn, da die Klasse nur je einen Plott beherbergt. Drucke ich als alle Plots, wird im Parent ein QPrinter erzeugt und für jeden Plot übergeben. Aber danke für deine Hilfe! Das mit dem Scalen habe ich auch hinbekommen, nachdem ich den Viewport (Größe) des Printer beim Zeichnen der Pixmap zugrunde gelegt habe und nicht den sizeHint des Windows.

Verfasst: 27. Juli 2007 08:48
von Christian81
Es wird stets nur ein QPrinter erzeugt.
Sorry, das sehe ich aus deinem Code nicht so - imho wird immer wieder ein QPrinter erzeugt ohne den alten ggf. zu löschen. Aber evtl. hast Du auch den betreffenden Codeschnipsel nicht gepostet.

Verfasst: 27. Juli 2007 09:21
von C_R
Jein, du hast schon recht. Der wird nicht gelöscht.. bzw. wurde. habe mir deinen Tip zu Herzgen genommen. Allerdings wurde stets nur EIN printer erzeugt pro Plotter-Instanz. (Ok, wenn ich diesen EINEN Plot mehrmals drucke, dann mehrere, was aber keinen Sinn ergibt, da man ja normalerweise nicht mehrmals dasselbe drucken will). Drucke ich alle Plots wird eben in der Parent EIN printer erzeugt und übergeben. Nur der printer* wird dann auf extPrinter* gesetzt.