Seite 1 von 1

QPrinter (.newPage)

Verfasst: 31. März 2006 11:53
von Marco812
Hallo,

ich habe eine Klasse zum Drucken, was auch super funktioniert. Nun habe ich aber das Problem, das ich an einer bestimmten stelle im Text, angeben möchte, wann ein Seitenwechsel erfolgen soll und nicht erst wenn die Seite zu ende ist.

Kann ich in dem String irgend etwas für einen Seitenwechsel mit übergeben oder wie muss ich die Druckfunktion anpassen, damit es funktioniert?

Gruß

Marco812

Code: Alles auswählen

 
void MyClass::printMe(QString printHtml)
{
 QPrinter * printer = new QPrinter( QPrinter::HighResolution ) ;
 printer->setFullPage( TRUE ) ;
 if ( printer->setup( this ) ) {
  QPainter p ;
  if ( !p.begin( printer ) ) {
   return ;
  }
  QPaintDeviceMetrics metrics( p.device() ) ;
  int dpiy = metrics.logicalDpiY() ;
  margin = (int)( ( 1 / 2.54 ) * dpiy ) ; // 1 cm margins
  QRect body( margin, margin * 2, 
     metrics.width() - 2 * margin, 
     metrics.height() - 4 * margin ) ;
  
  Q3SimpleRichText richText(printHtml, QFont());
  richText.setWidth( &p, body.width() ) ;
  QRect view( body ) ;
  
  page = 1;
  do {
   richText.draw( &p, body.left(), body.top(), view, colorGroup() ) ;
   printer->newPage() ;
   page++ ;
   if ( view.top() >= richText.height() )
    break ;
  } while (TRUE) ;
  
 }
}

Verfasst: 31. März 2006 12:06
von macman
Du hast deinen Text, den schreibst Du in ein Richtext und das malst Du dann auf den Drucker. Der Drucker bekommt also nur ein Bild, kann also nicht erkennen, wann ein Seitenwechsel erfolgen soll.

Dazu müsstest Du den Text vorher trennen und die einzelnen Teile einzeln drucken.

Verfasst: 31. März 2006 18:11
von Marco812
Hallo,

sorry ich hatte mich vertippt, das sollte (QPrinter::PdfFormat) heißen. Das mit dem Drucker wäre dann kein Problem, aber wie mache ich das mit dem PDF. Ich möchte schon alles in einem PDF haben, aber getrennt.

Gruß

Marco812

Verfasst: 3. April 2006 07:58
von macman
Ich sehe keinen Unterschied. Wenn ich nämlich sowas lese
PDF files generated by Qt are not searchable.
dann sieht das für mich so aus, als wenn Qt da auch nur ein Bild in ein PDF schreibt.

Verfasst: 6. April 2006 11:31
von Marco812
Hallo,

ich verstehe nicht so ganz wie das ganze funktionieren soll, ich habe es jetzt so versucht, wie in den Beispielen.

Allerdings brauche ich noch so etwas wie eine funktion print newPage und über gebe dann den String und den QPrinter, aber ich weiß nicht wie ich das machen soll. Wäre jemand so nett und würde es mir an einem kleinen Beispiel erklären.

Gruß

Marco812

void MyClass::printMe(QString printHtml)
#ifndef QT_NO_PRINTER
QString fileName = QFileDialog::getSaveFileName(parentWidget, "Export PDF", QString(), "*.pdf");

if (fileName.isEmpty())
return false;
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
textEdit.setHtml(printHtml);
textEdit.document()->print(&printer);
#endif
}

Verfasst: 6. April 2006 11:51
von macman
Wie ich schon sagte, Du wirst deinen printHtml String zerlegen und einzeln drucken müssen.

Code: Alles auswählen

void MyClass::printMe(QString printHtml)
#ifndef QT_NO_PRINTER
    QString fileName = QFileDialog::getSaveFileName(parentWidget, "Export PDF", QString(), "*.pdf");

    if (fileName.isEmpty())
        return false;
    QPrinter printer(QPrinter::HighResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName(fileName);

    QStringList sl = printHtml.split(seitentrennzeichenkette, QString::SkipEmptyParts);
    for (int i=0; i<sl.count(); i++)
    {
        textEdit.setHtml(sl[i]);
        textEdit.document()->print(&printer);
        printer.newPage();
    }
#endif
}
Über die Problematik, wie man in einen HTML-String einen Seitentrenner einbaut, rede wir jetzt mal nicht.

Verfasst: 6. April 2006 15:26
von Marco812
Hallo,

vielen Dank für den Tipp. Das mit dem Trennen funktioniert aber nicht so richtig. Vielleicht kannst du mir noch sagen wie man einen vernünftigen Seitentrenner einbaut oder wo ich Informationen dazu bekomme?


Gruß

Marco812

P.S.
Wie kann ich jetzt bei dem Printer die Seitenränder festlegen?

Verfasst: 6. April 2006 15:53
von macman
Keine Ahnung wie Du den Seitentrenner aufbauen kannst. In HTML gibt es keine Seitentrenner, eine HTML-Seite ist immer eine Seite. Alles andere macht kaum einen Sinn. Du brauchst also etwas als Separator, was in normalen HTML nicht angezeigt wird. Probier es mit <ff />

Wo bekommst Du überhaupt den HTML-String her? Den Seitenvorschub kannst Du auch nur zwischen 2 Absätzen machen, sonst gehen eventuell Attributinformationen verloren. Angenommen Du hast etwas wie <b>ganz viel Text</b>, dann kannst Du den Trenner nicht einfach in den Text bringen. Dann wäre ein Teil fett, der andere nicht, oder gleich beide normal. Ich weiß nicht wie man das am besten löst, aber ich denke die Problematik ist sichtbar.

Verfasst: 6. April 2006 18:56
von Marco812
Hallo,

den HTML-String baue ich mir aus den benötigten Daten zusammen und übergebe ihn dann. Zwischen dem Text muss auch keine neue Seite beginnen. Ein Abschnitt kann mal eine halbe aber auch mal 3 Seiten lang sein nur dann muss eben ein Wechsel erfolgen. Deshalb ist es recht einfach zu sagen, wann der Wechsel erfolgen soll. Beispiel:

Alle Spieler in der Mannschaft:

Spieler 1
Spieler 2
usw.

// hier ein Seitenwechsel

Alles Ergebnisse der Mannschaft:

Ergebnis 1
Ergebnis 2
usw.

// hier ein Seitenwechsel

usw.

Soweit so gut der Wechsel funktioniert auch, aber die Seitenzahlen stimmen nicht. Es steht überall Seite1. Wie kann ich die Seitenzahl fortlaufend bekommen oder sogar "Seite 1" schreiben und nicht nur "1"?

Gruß

Marco812