QTextEdit: Unterscheidung Soft-/Hardreturn

Alles rund um die Programmierung mit Qt
Antworten
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

QTextEdit: Unterscheidung Soft-/Hardreturn

Beitrag von gerome69 »

Hallo,
ich hätte gerne in einem QTextEdit ENTER (soll zu "</p><p>" werden, ist ok) und SHIFT+ENTER(soll zu "<br />" werden) eingeben können.

Per Default scheint er da nicht zu unterscheiden und baut immer "</p><p>" ein, egal ob mit oder ohne SHIFT-Taste.

Ich habe versucht das Signal returnPressed() abzufangen und dann sowas versucht:
void QTextEditGUI::returnPressed() {
textEdit->insert("<br>");
}

[Müßte eh erweitert werden auf Prüfung von SHIFT-Taste und Entfernen des "</p><p>"].
Dann schreibt er mir aber halt "<br>" im Klartext hin. Als Tag kriege ich das nicht eingefügt.

Kann mir jemand nen Tip geben, wie das zu machen ist?

Vielen Dank, Gérôme
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube das geht nur über diesen Umweg:
http://doc.trolltech.com/3.3/qtextedit.html#text-prop

Also erst alles als html abholen, dein <br> hinzufügen und wieder setzen. Es kann ja auch sein dass Du wirklich <br> schreiben willst, also kann insert gar nicht gehen. Deswegen gibts in Qt4 dann auch setText() und setHTML().
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

Christian81 hat geschrieben: Also erst alles als html abholen, dein <br> hinzufügen und wieder setzen. Es kann ja auch sein dass Du wirklich <br> schreiben willst, also kann insert gar nicht gehen. Deswegen gibts in Qt4 dann auch setText() und setHTML().
Das Problem ist, daß garnicht zwischen SHIFT+RETURN oder nur RETURN unterschieden wird.

Ich habe es jetzt wie folgt gelöst (QT 4.1):
- abgeleitete Klasse von QTextEdit:

Code: Alles auswählen

class MyTextEdit:public QTextEdit {
     Q_OBJECT
     protected: void keyPressEvent(QKeyEvent*);          
};
Dann implementiert:

Code: Alles auswählen

void MyTextEdit::keyPressEvent(QKeyEvent* e) {
     if ((e->modifiers()==Qt::ShiftModifier) &&
         ((e->key()==Qt::Key_Return)||(e->key()==Qt::Key_Enter))
        ) this->insertHtml("<br />");
     QTextEdit::keyPressEvent(e);
}


Dann steht allerdings hinterher im HTML:
"<br /></p><p>"

Und das jage ich beim Rausspeichern des HTML halt einfach durch ein
.replace("<br /></p><p>","<br />");

Voilá.

Ganz schöner Kampf, aber es geht.

Gruß, Gérôme
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum so umständlich?

Code: Alles auswählen

void MyTextEdit::keyPressEvent(QKeyEvent* e) {
     if ((e->modifiers()==Qt::ShiftModifier) &&
         ((e->key()==Qt::Key_Return)||(e->key()==Qt::Key_Enter))) {
         this->insertHtml("<br />");
         return;
     }
     QTextEdit::keyPressEvent(e);
}
So bekommt QTextEdit nichts davon mit und fügt nichts ein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

Christian81 hat geschrieben:Warum so umständlich?
So bekommt QTextEdit nichts davon mit und fügt nichts ein.
Also, funktionieren tut es einwandfrei.
Umständlich? Ja, finde ich auch.
Aber hast du nen besseren Vorschlag, wie ich ENTER und SHIFT+ENTER unterschiedlich handeln kann?

Bei deiner Lösung ist das Problem, daß dann eben kein Zeilenumbruch im Editor-Fenster erzeugt wird und der Cursor einfach an der alten Stelle stehen bleibt. Das ist für den Benutzer sicher höchst verwirrend.
Ein insertHTML("<br />\n") hat leider den Cursor auch nicht in die nächste Zeile bewegt :-(

Gruß, Gérôme
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Evtl. danach mit http://doc.trolltech.com/4.1/qtextedit.html#textCursor denj Cursor ans Ende des Dokuments setzen? bzw. eben ein paar Zeichen weiter als die jetzige Position.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten