QPrinter mal wieder...

Alles rund um die Programmierung mit Qt
Antworten
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

QPrinter mal wieder...

Beitrag 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
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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..
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich sehe nirgends wo

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

wieder freigegeben wird...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

sorry, die wohl dumme frage, aber was macht das für einen unterschied?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag 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.
Antworten