QTextDocument: blocks durchgehen und newlines erkennen?

Alles rund um die Programmierung mit Qt
Antworten
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

QTextDocument: blocks durchgehen und newlines erkennen?

Beitrag von -=Freaky=- »

hi,

ich bin dabei, ein QTextDocument durchzugehen, um den inhalt in ein anderes format zu bringen.
ganz hierarchisch wird abgearbeitet:
- alle frames und tables
- darin alle blocks und lists
- darin alle fragments

d.h., dass am ende die texte der einzelnen fragments mit entspr. formatierung zusammengesetzt werden.

allerdings sind QTextBlocks, soweit ich das in erfahrung gebracht habe, u.a. durch zeilenumbrueche getrennt, d.h., die sind einfach nicht im text enthalten (also auch nicht in den fragments), weil sie als separatoren behandelt werden.

wie mache ich es nun, um auch zeilenumbrueche an den richtigen stellen im text mitzuverarbeiten?
QTextDocument::characterAt( einBlock.position() - 1 ) gibt an den entsprechenden stellen kein newline, sondern einen QChar mit int-wert 0 (allerdings isNull() == false).
ich schaetze, das ist so ein entspr. separator.

danke im voraus fuer alle antworten!

mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

sorry fuers hochbringen des threads.

ich habe es nun erst einmal folgendermassen geloest, was mit aber noch sehr zusammengeflickt vorkommt:
- QTextCursor fuer das entspr. QTextDocument erstellen
- den aktuell zu verarbeitenden QTextBlock auswaehlen (via select( QTextCursor::BlockUnderCursor ) wird dabei auch der "ParagraphSeparator" vor dem block mit ausgewaehlt!)
- ein QTextDocumentFragment erstellen, im constructor den erstellten QTextCursor uebergeben
- QTextDocumentFragment::toPlainText() ist der ausgewaehlte text inkl. des zeichens vor dem block
-> QTextDocumentFragment::toPlainText().at( 0 ) == '\n', wenn vor dem block ein zeilenumbruch steht.

der code:

Code: Alles auswählen

// f: QTextFrame*
QTextCursor tcursor( f->document() );
tcursor.setPosition( currentBlock.position() );
tcursor.select( QTextCursor::BlockUnderCursor );
QTextDocumentFragment docFragment( tcursor );
QChar charBefore = 0;
if( docFragment.toPlainText().length() >= 1 )
	charBefore = docFragment.toPlainText().at( 0 );
if( charBefore == '\n' )
	// newline einfuegen
.. mache ich eigentlich irgendetwas falsch, sodass mir niemand antworten will, oder stelle ich einfach bloede fragen, die schlecht zu beantworten sind?

anyway, falls jemand einen eleganteren vorschlag hat, immer her damit!

// edit:
verdammt, natuerlich funktioniert der kram so nicht!
so gibts zwar die richtigen zeilenumbrueche, allerdings gibt es einen zeilenumbruch auch nur einmal, weil mit QTextEdit::BlockUnderCursor nur ein zeichen vor dem block ausgewählt wird.
d.h. wenn man z.b. eine leere zeile im document hat, kann man den ganzen quatsch vergessen ...

ich dreh noch durch, ist vllt. mein ganzer ansatz murks?!
danke fuer jeden noch so erniedrigenden kommentar (es ist sowieso nichts erniedrigender als gar kein kommentar ...)!

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

.. mache ich eigentlich irgendetwas falsch, sodass mir niemand antworten will, oder stelle ich einfach bloede fragen, die schlecht zu beantworten sind?
Oder stellst du eine Frage zu einem Thema, mit dem sich nicht wirklich jemand auskennt?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

upsala hat geschrieben:
... mache ich eigentlich irgendetwas falsch, sodass mir niemand antworten will, oder stelle ich einfach bloede fragen, die schlecht zu beantworten sind?
Oder stellst du eine Frage zu einem Thema, mit dem sich nicht wirklich jemand auskennt?
ja, auch soetwas meinte ich damit ... :)
danke fuer deine antwort. ;)

mfg,
julian
Antworten