Seite 1 von 1

QPrinter - newPage() - Problem

Verfasst: 31. Juli 2008 10:05
von tribari
Hallo zusammen,

ich möchte nun eine Logdatei im PDF-Format schreiben. Jedoch funktioniert irgendwie der Befehl newPage() nicht wirklich :(

was mache ich falsch?

Hier im groben, wie es abläuft bei mir:

Code: Alles auswählen


QPrinter m_Printer;
QString m_protocolFilename = <<Pfad für Datei>>;
QTextEdit m_protocolText;

m_Printer.setPageSize(QPrinter::A4);
m_Printer.setFullPage(TRUE); 
m_Printer.setOutputFormat(QPrinter::PdfFormat); 
m_Printer.setOutputFileName(m_protocolFilename); 

Schleife für mehrmaliges wiederholen()
{

m_protocolText.setFontPointSize(12); 
m_protocolText.setTextColor(QColor(Qt::black));
m_protocolText.insertPlainText("Irgendnen Text");

<<Die Schriftgröße und Farbe veränder ich öfters... ausserdem wird hier jetzt viel Text in m_protocolText geschrieben>>

m_protocolText.print(&m_Printer);
m_Printer.newPage();

}

mit newPage() hatte ich gehoft jedesmal auf eine neue Seite zu kommen... aber irgendwie hat der Befehl keinerlei Auswirkung :(


Danke schonmal im Vorraus

lg

tribari

Verfasst: 31. Juli 2008 14:47
von tribari
hat niemand eine Idee? Das Problem wurmt mich leider sehr... irgendwie schein ich nicht drauf zu kommen :wink:

Verfasst: 31. Juli 2008 14:53
von upsala
Schon mal im Task-Tracker nachgeschaut? Außerdem wäre das Betriebssystem und die Qt-Version interessant, da Qt schreibt, daß es dafür Betriebsystemspezifische Funktionen verwendet.

Verfasst: 31. Juli 2008 14:57
von tribari
wtf Task-Tracker? :oops: den kenn ich noch nicht ... sorry ;)
Oder du meinst etwas was ich zwar kenne, aber nicht unter dem namen :roll:

Ich verwende QT 4.3.4.

OS ist Windows XP Proffessional.

Der Druck in die pdf-Datei funktioniert ja auch tadellos - bloß ich will die Macht haben und selbst bestimmen können wann mein Programm eine neue Seite anzufangen hat :twisted:

Hoffentlich gibbet ne Lösung.

Verfasst: 31. Juli 2008 15:25
von upsala

Verfasst: 1. August 2008 08:53
von tribari
ne den kannte ich noch nicht - ist ja nice ;-)

trotzdem kann ich da nichts finden ... :-/

Verfasst: 1. August 2008 17:42
von patrik08
newPage ... braucht man nicht wenn man QTextDocument
doc->setPageSize ( groesse der seite ); setzt...

und nicht mehr QTextDocument::adjustSize () aufruft !!

die Policy kann man trozdem brauchen ...
PageBreakFlags QTextBlockFormat::pageBreakPolicy () const


der lebende beweis und immer noch editierbar ist:

Bild

svn
http://fop-miniscribus.googlecode.com/s ... izeScroll/
das ding editiert den text wie es im druck zu sehen ist...

Verfasst: 1. August 2008 18:12
von upsala
@Patrik08: QTextDocument verwendet intern auch newPage()...

Verfasst: 1. August 2008 18:57
von patrik08
upsala hat geschrieben:@Patrik08: QTextDocument verwendet intern auch newPage()...
richtig .... newPage() macht nicht anders als einen PageBreackPolicyInsert der man nicht weiss wo er ist...
Ich will aber wissen wo diesen PageBreack ist, damit ich wieder im richtigen xsl-fo xml setzen kann. Da dort die PDF Bookmark abhangig sind um zum richtigen name zu springen ....

QTextDocument ->setPageSize ( QSizeF ); /* ohne drucker enum */

setzt... die richtige groesse der seiten .... und die somit verbundene seitenzahl

die man gut durch painten kann sei es drucker oder gui

Code: Alles auswählen

 Q_ASSERT(_d->pageSize().isValid());
   const int PageSumm = qBound (1,_d->pageCount(),MaximumPages);
   for (int i = 0; i < PageSumm; ++i)  {
		 DrawPage(i,painter);   /* auch als QPicture im 
               QCache  ist verdamt schnell */
	 }
damit is es egal welches OS oder drucker...

und die Page PageBreackPolicy werden richtig interpretiert von
QAbstractTextDocumentLayout ....

Code: Alles auswählen


 void TextProcessor::ParaBlockPageBreackPolicyInsert()
 {
	 if (Modus != PAGES) {
		 return;   /* only on pages draw modus not flat Layer text */
	 }
	 QTextCursor c = textCursor();
	 QTextBlock bb = c.block();
	 QTextBlockFormat bbformat = bb.blockFormat();
	 QStringList items;
	 items << tr("PageBreak Auto") << tr("PageBreak AlwaysBefore") << tr("PageBreak AlwaysAfter");
	 int index  = 0;
	 if (bbformat.pageBreakPolicy () == QTextFormat::PageBreak_AlwaysBefore ) {
		 index = 1;
	 } else if (bbformat.pageBreakPolicy () == QTextFormat::PageBreak_AlwaysAfter ) {
		 index = 2;
	 }
	 bool ok;
	 QString item = QInputDialog::getItem(0, tr("Get PageBreakFlags"), tr("Set Policy:"), items,index, false, &ok);
	 
	 if (ok && item.size() > 0) {
		 int choise = items.indexOf(item);
		 if (choise == 1) {
			 bbformat.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysBefore);
		 } else if (choise == 2) {
			 bbformat.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysAfter);
		 } else {
			 bbformat.setPageBreakPolicy(QTextFormat::PageBreak_Auto);
		 }
		 c.setBlockFormat(bbformat);
		 emit q_pageupdate();
	 }
	 /*
QTextFormat::PageBreak_Auto
QTextFormat::PageBreak_AlwaysBefore
QTextFormat::PageBreak_AlwaysAfter
	 */
 }


Darum handlet es ja iher um seiten zu umbrecken koennen wo und wie man will .. da gibt es keine bug .. und funktioniert richtig mit qt4.4 && qt4.5