markierten Text in einem textEdit ändern?

Alles rund um die Programmierung mit Qt
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

markierten Text in einem textEdit ändern?

Beitrag von ensacom »

Hallo, ich bin absoluter Anfänger in Sachen Qt3

ich möchte nun den markierten Text in einem textEdit zwischen html-tags setzen.
Aus "hallo Text" soll also z.B. "<b>hallo Text</b>" werden.

Ich bin nun so weit, wobei jedoch der nicht markierte Text entfernt wird was ja nicht sein soll.

Code: Alles auswählen

void Form1::boldtextSlot()
{
    textEdit1->setFocus();
    textEdit1->setText("<b>"+textEdit1->selectedText()+"</b>"); 
}

Ich hoffe mir kann einer helfen.

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

Beitrag von -=Freaky=- »

Code: Alles auswählen

void Form1::boldtextSlot()
{
    textEdit1->setFocus();
    QString str = textEdit1->.text();
    int pos = str.indexOf( textEdit1->selectedText() );
    str.insert( pos, "<b>" );
    str.insert( pos+textEdit1->selectedText().length()+3, "</b>" );
    textEdit1->setText( str );
}
bei mir funktioniert das so.

mfg,
julian
Zuletzt geändert von -=Freaky=- am 5. Januar 2007 02:00, insgesamt 1-mal geändert.
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Vielen Dank, leider funktioniert es nicht
ich bekomme immer folgende Fehlermeldung

Code: Alles auswählen

.ui/../form1.ui.h: In member function ‘virtual void Form1::boldtextSlot()’:
.ui/../form1.ui.h:97: error: expected unqualified-id before ‘.’ token
.ui/../form1.ui.h:98: error: ‘class QString’ has no member named ‘indexOf’
make: *** [.obj/form1.o] Fehler 1
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

sorry, ich habe in der qt4-doku geguckt. probier mal, das "indexOf"einfach durch "find" zu ersetzen.

mfg,
julian
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Danke, ich habe es jetzt so. Das mit der richtigen Position der tags stimmt zwar noch nicht aber das werde ich schon noch herausfinden.

Irgendwie beendet sich das Programm jetzt immer wenn ich ein Wort markiere und die tags erstellen lasse und ich dann einen Textabschnitt, in dem auch dieses bereits mit einem tag markierte Wort enthalten ist.

Code: Alles auswählen

void Form1::boldtextSlot()
{
    textEdit1->setFocus();
    QString str = textEdit1->text();
    int pos = str.find( textEdit1->selectedText() );
    str.insert( pos-1, "<b>" );
    str.insert( pos+textEdit1->selectedText().length()+1, "</b>" );
    textEdit1->setText( str ); 
}
[/quote]
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ok, vielleicht funktioniert es so. sorry, ich kann es nicht ausprobieren was ich dir hier vorlege, ich ahbe im moment kein qt3 zur hand.

Code: Alles auswählen

textEdit1->setTextFormat( Qt::RichText ); // das gehört in den konstruktor von Form1

void Form1::boldtextSlot()
{
    textEdit1->setFocus();
    QString str = textEdit1->text();
    int pos = str.find( textEdit1->selectedText() );
    str.insert( pos, "<b>" );
    str.insert( pos+textEdit1->selectedText().length()+3, "</b>" );
    textEdit1->setText( str );
}
mfg,
julian
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Danke dir. ich werde es gleich mal testen

Mir ist aber gerade was aufgefallen.

Wenn mein text mehrmals das Wort "Test" enthält und ich das dritte Vorkommen z.B. markiere und fett machen will, dann wird das erste Vorkommen fett gemacht nicht das markierte weil er ja nach dem markieretn string sucht und diesen abändert.

Wie kann ich das markierte Vorkommen bearbeiten lassen und nicht das erste?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

textEdit1->setTextFormat( Qt::RichText ); // das gehört in den konstruktor von Form1

Code: Alles auswählen

void Form1::boldtextSlot()
{
    textEdit1->setFocus();
    textEdit1->insert( "<b>"+textEdit1->selectedText()+"</b>" );
}
sieht irgendwie sehr wagemutig aus, aber nach qt3-doku sollte das gehen. der text ( "<b>"+textEdit1->selectedText()+"</b>" ) wird an der aktuellen cursor-position eingefügt und die aktuelle markierung wird dabei standartmäßig zuerst gelöscht.

//edit: so bis morgen ich geh erstmal schlafen...gute nacht

mfg,
julian
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Vielen Dank für deine Hilfe zu später Stunde

ich habe es jetzt so gelöst und es funktioniert einwandfrei.

Code: Alles auswählen

void Form1::boldtextSlot()
{
    if( textEdit1->selectedText().length() > 0 )
    {
      textEdit1->setFocus();
      textEdit1->insert( "<b>"+textEdit1->selectedText()+"</b>" );
      textEdit1->removeSelectedText();
    }  
}
Gibt es eigentlich eine Möglichkeit diese funktion für z.B. 5 Buttons zu verwenden, so dass ich nur b, i, u oder s für die gewünschten tags übergeben muss?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

da wollt man eiegtnlich schlafen und guckt dann doch schnell nochma rein... :D

frage:
funktioniert das nur mit der letzten zeile dran, also nur mit textEdit1->removeSelectedText(); ?? denn nach qt3-doku sollte das automatisch in der zeile davor passieren.

für mehrere buttons, wie meinst du das?
du könntest das so machen

Code: Alles auswählen

void Form1::formatTextSlot( const char &c )
{
  if( textEdit1->hasSelectedText() ) // das ist eleganter find ich :)
    {
      textEdit1->setFocus();
      textEdit1->insert( "<"+c+">"+textEdit1->selectedText()+"</"+c+">"
      /*textEdit1->removeSelectedText();*/
    }
}
wenn es das war was du wolltest mit den 5 buttons.
hierbei müsstest du nur noch irgendwo sicherstellen, dass auch nur gültige zeihen übergeben werden (nicht das da z.B. steht "<ü>FalschFormatierterText</ü>").

so jetzt aber...gute nacht!

mfg,
julian
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Nochmal vielen Dank für deine Hilfe du hast mir wirklich sehr geholfen.
Du hattest auch recht damit dass die Zeile

Code: Alles auswählen

textEdit1->removeSelectedText();
überflüssig ist. Komisch Anfangs ging es nicht ohne diese Zeile.

Hast Du eine Idee wieso ich egal ob ich AutoText, PlainText oder RichText einstelle, immer nur den Quelltext gezeigt bekomme und der z.B. mit < b> Tags markierte Text nicht auch fett angezeigt wird?
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

des rätsels lösung (auszug aus der qt3-textedit-doku):
If you use RichText then setText() and append() will assume that the text they are given is rich text. insert() simply inserts the text it is given.
insert() beachtet die html-tags also nicht.

mfg,
julian
Zuletzt geändert von -=Freaky=- am 5. Januar 2007 14:19, insgesamt 2-mal geändert.
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Danke, ich habe mir jetzt neben Qt3 auch mal Qt4 installiert.
Kann es sein dass man unter Qt4 nur die Oberfläche erstellen kann?
Mit Qt3 kann ich ja das komplette Project erstellen. Bei Qt4 finde ich keinerlei Verweis auf den Source
ensacom
Beiträge: 24
Registriert: 4. Januar 2007 23:49

Beitrag von ensacom »

Das verstehe ich jetz nicht ganz. Ich habe ganz am Anfang setText und Append versucht was jedoch den ganzen Text erst gelöscht hat so das zum Schluss nur noch mein mit tags ausgestatteter Text vorhanden war

Code: Alles auswählen

    if( textEdit1->hasSelectedText() )
    {
      textEdit1->setFocus();
      textEdit1->insert( "<b>"+textEdit1->selectedText()+"</b>" );
    }  
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

???
meinst du jetzt den Qt4-designer? ja, mit dem kannst du nur die oberfläche machen. aus der ui-datei lässt du dir dann mit uic eine klasse (c++-code) erstellen und mit der arbeitest du in deinem quelltext weiter. geht bestimmt auch direkt mit den ui-dateien, aber ich bin auch gerade neu bei Qt4 und hab keine ahnung, wie ich die funktionalität der klasse aus dem designer sonst einrichten sollte.

//edit:
ja, setText() ersetzt den kompletten text, und append() hängt einfch was hinten dran.

mfg,
julian
Antworten