Qt TextEdit Cursor positionieren



  • Hallo
    Ich stehe im Moment ein bisschen mehr auf dem Schlauch als üblich.
    Folgendes
    ich möchte in einen TextEdit Widget den Cursor positionieren.
    d.h. anstatt Startpunkt 0,0 z.b. 10.2 oder wie auch immer.

    jetzt bin ich als Anfänger aber dermassen vom Funktionsumfang vom Qt erschlagen
    das ich nicht so ganz weiß wie ich die Sache angehen soll.

    Bitte helft mir.



  • Ich glaube mit Koordinaten lässt sich da nicht navigieren.
    Aber schon mal selbst geguckt?

    Von hier http://doc.qt.io/qt-5/classes.html
    nach da http://doc.qt.io/qt-5/qtextedit.html
    und da http://doc.qt.io/qt-5/qtextcursor.html
    und da http://doc.qt.io/qt-5/qtextdocument.html

    Evtl. auch mal eine Suchmaschine bemühen...



  • Natürlich habe ich bereits eine Suchmaschine genutzt.
    Find es in diesem Forum recht schade das einen immer mangelde Eigeninitative unterstellt wird.
    Ich schrieb bereits das ich etwas mit dem Funktionsumfang von QT überfordert bin.
    Ein kurzes Code Snippet würde an dieser Stelle mehr nutzen als ein paar Links auf die Doku von Qt.....



  • Moritx schrieb:

    Ich schrieb bereits das ich etwas mit dem Funktionsumfang von QT überfordert bin.
    Ein kurzes Code Snippet würde an dieser Stelle mehr nutzen als ein paar Links auf die Doku von Qt.....

    Das Problem ist, dass nicht viele genau passende Code Snippets parat haben. Wenn ich in der Arbeit wäre, könnte ich dir gleich was zeigen, daheim mache ich viel weniger mit Qt. Normalerweise weiß man das alles auch nicht auswendig, sondern nur so ungefähr und muss sich dann entweder in seinem Code etwas ähnliches anschauen, oder etwas ausprobieren. Und ausprobieren geht schon etwas zu weit, nur um in einem Forum zu antworten. Von dem her musst du solche Antworten schon verstehen.

    Mein Vorgehen bei sowas wäre auch in die Doku zu schauen. Ich weiß, dass es die Klasse QTextCursor gibt und ich vermute, dass QTextEdit etwas hat, um die zu setzen. Deswegen mache ich erst die Doku auf (einfach in Google nach QTextEdit suchen, ich speichere mir da keine Links). Dann suche ich da auf der Seite einfach nach "cursor", weil ich eh schon vermute, dass da QTextCursor vorkommen wird, mir aber nicht 100% sicher bin. Und da gibts eine Funktion setTextCursor. Steht aber nicht sehr viel dabei.
    Im Endeffekt ist die QTextCursor API auch nicht so ganz intuitiv, ohne mir das genau anzuschauen oder auszuprobieren könnte ich das jetzt auch nicht sagen, hab damit auch nicht so viel gemacht. Du kannst dir erst einen Cursor vom QTextEdit holen (textCursor()) und dann mit movePosition verschieben. Bzw. schau eben in die Doku, was QTextCursor für Methoden hat und such dir was passendes raus. Dass du einfach so zu Zeile Zeile 10 Spalte 2 springen kannst, glaube ich jetzt aber auch nicht, das ist evtl. etwas tricky.



  • @Mechanics danke soweit hat mir dein Text schon etwas geholfen.
    Nur bin ich immer noch nicht zu einen Ergebniss gekommen.
    Hier mein Dokumentierter Code:

    int ZeiPosition;
        text=ui->lineEdit->text();//Liest den Text in einen QString
    
        Zeiger=ui->textEdit->textCursor();// Holt die Cursorposition aus dem TextEdit Objekt in das Zeiger Objekt
    
        ZeiPosition=Zeiger.position();// ordnet der ZeiPositionsvariablen die Zeigerposition als int wert zu NUR ZUM TESTEN      WAS VOR SICH GEHT
        puffer.setNum(ZeiPosition);//Die Cursorposition wird einen QString zugewiesen NUR ZUM TESTEN
        ui->textEdit->setPlainText(puffer);// hier soll die Cursorposition ausgegeben werden .... klappt nicht ?? NUR ZUM TESTEN
    
        Zeiger.setPosition(15,QTextCursor::MoveAnchor);//an dieser Stelle soll dem Zeigerobjekt eine neue Position zugewiesen werden ....klappt nicht
    
        ui->textEdit->setTextCursor(Zeiger);//Dem TextEdit Objekt soll der modifizierte Cursor zugeteilt werden ..... klappt nicht
        ui->textEdit->setPlainText(text);// Textausgabe
    

    Ich weiss noch nicht so ganz wo mein Fehler liegt ...
    Hilfe wäre schön 🙂

    Wenn man den Code besser anders formatiert, sagt einfach bescheid...



  • Die Kommentare sind nur fürs Forum? Im Produktivcode wären sie wenig hilfreich.

    text=ui->lineEdit->text();//Liest den Text in einen QString

    Wozu?

    Mich stören die vielen "klappt nicht" 😉 Müsste eigentlich soweit funktionieren. Wenn, dann zumindest genauer beschreiben, was nicht klappt. Du weist einem String einen int Wert zu mit setNum, das muss ja funktionieren. Und die Ausgabe mit setPlainText muss auch funktionieren. Und QTextCursor::setPosition muss ja auch irgenwas machen.
    Am Ende setzt du wieder den Originaltext zurück. Wenn du das Beispiel genau in der Form ausprobiert hast, wärs ja nicht überraschend, wenn du keine Ausgabe siehst, du überschreibst sie ja wieder.
    Hast du durchdebuggt, was genau passiert?



  • Ja die Kommentare sind nur fürs Forum

    text=ui->lineEdit->text();//Liest den Text in einen QString
    

    Ist in diesen Zusammenhang etwas verwirrend.
    Ich lese den Text aus einer QLineEdit Zeile ein und kopiere den Text in ein QTextedit Feld.
    Damit es jetzt im Forum schön kompakt ist habe ich das alles in eine Funktion gepackt.
    Du hast recht die Zeile :

    ui->textEdit->setPlainText(puffer);
    

    funktioniert.
    Sie gibt als Wert eine 1 aus.
    Nach einigen Versuchen bin ich fast der Meinung das dieser Wert die Zeilenummer wiedergibt.
    Und das ein horizontales Verschieben des Cursors mittels SetPosition nicht möglich ist.
    Für diese Vermutung spricht auch die Fehlermeldung: QTTextCursor::SetPosition '5' out of range
    Wobei die Zahl 5 in diesen Fall die Zeile ist in welche ich mittels der Returntaste im TextEdit Objekt gewandert bin.

    Ich seh schon das wird noch richtig schwierig.

    jetzt schäme ich mich fast aber ich weiß nicht wie ich den Debugger richtig bediene.(zumindest nicht so wie ich gerne könnte )



  • Moritx schrieb:

    Nach einigen Versuchen bin ich fast der Meinung das dieser Wert die Zeilenummer wiedergibt.

    Das müsste die absolute Position sein, unabhängig von Zeile und Spalten. Kann sein, dass das ändern des Textes den QTextCursor ungültig macht. Du änderst ja den Text und rufst dann auf einem Cursor, den du dir vorher geholt hattest, die Position.

    Moritx schrieb:

    jetzt schäme ich mich fast aber ich weiß nicht wie ich den Debugger richtig bediene.(zumindest nicht so wie ich gerne könnte )

    Das ist aber wichtig, das musst du dir schon aneignen. Schämen muss man sich dafür nicht. Ich konnte auch jahrelang nichts mit dem Debugger anfangen. Habe damals Delphi programmiert, habs hauptsächlich aus schlechten Büchern gelernt, da wurde der Debugger kaum erwähnt und Internet hatte ich damals nicht. Habe bei Fehlern dann auch entsprechend oft rumgeraten, was eigentlich schiefgeht. Kann man alles wunderbar einfach rausfinden, wenn man den Debugger bedienen kann.
    Man kann übrigens auch in Qt reindebuggen, mach ich in der Arbeit ständig (nur jetzt nicht unbedingt mit diesem Document, Cursor usw. Zeugs), dann sieht man genau, was passiert und wie das alles funktioniert.



  • Für solche Zwecke lege ich mir immer ein kleines Test-Projekt an, in welchem ich dann gezielt das gestellte Problem nachvollziehe und eine Lösung erarbeiten kann
    Im Falle der Cursorpositionierung in einem QTextEdit ist der Vorschlag von Mechanics genau richtig. Mit QTextCursor lässt sich der Cursor sehr gut Positionieren. Anbei ein kleiner Ausschnitt aus dem Text-Projekt welches ich mal eben schnell erstellt habe:

    void MainWindow::on_buttonIncPos_clicked() {
        QTextCursor actCursor = ui->textEdit->textCursor();  // den aktuellen Textcursor aus dem QTextEdit speichern
        int iCurPos = actCursor.position();  // die aktuelle Cursorposition als Int speichern
        iCurPos += ui->spinBox->value();  // hier habe ich Werte von -20 bis +20 zur Auswahl, um welche dann die Cursorposition geändert wird
        actCursor.setPosition(iCurPos);  // den QTextCursor neu Positionieren
        ui->textEdit->setTextCursor(actCursor);  // und den geänderten TextCursor wieder an das QTextEdit weitergeben
        ui->textEdit->setFocus();
    }
    

    Wichtig scheint in diesem Fall, das am Ende das QTextEdit wieder den Focus erhält, der ja beim Klicken auf den Button zu diesem gezogen wurde. Dann siehst Du den geänderten Cursor sofort. Denn wenn Du mit der Maus dann in das QTextEdit klickst wird der Cursor wieder an der Stelle gesetzt an welcher der Mauscursor innerhalb des QTextEdit sich befindet.
    Schau Dir auch die weiteren Methoden der Klasse QTextCursor an, dort gibt es z.B. für die 'setPosition'-Methode noch einen 'MoveMode'-Parameter, welcher die Positionierung ebenfalls beeinflusst.



  • Danke euch beiden so weit.
    Ich werde deinen Code ausschnitt mal ausprobieren.
    Und mir die Methoden der QTextCursor Klasse noch genauer anschauen.
    Sowie mich auch noch näher mit dem Debugger beschäftigen.
    Mit anderen Worten ich habe ersteinmal genug zu tuen ..

    Danke...



  • jetzt möchte ich dieses Thema nocheinmal hervor holen.
    Nach einigen nachdenken und herumprobieren bin ich zu folgenden Schluß gekommen:

    Der von mir zuerst gewählte Ansatz ist falsch!

    Der Text welcher in QTextEdit dargestellt wird oder in meinen Fall übergeben wird ist ja bloß ein normaler QString.
    Um den Text wie gewünscht Formatiert auszugeben habe ich mich nun für einen anderen weg als über die Cursor-Positionierung enschieden.
    Ich füge den zu übergebenden Text einfach entsprechende Steuerzeichen (Tabs, Return etc.) hinzu.
    Und schon klappt es so wie gewünscht 😃

    Warum ich das hier schreibe ??
    Zum einen möchte ich zeigen das die Gedankenanstöße welche ich hier erhalten habe mir weitergeholfen haben.
    Und zum anderen hilft es ja auch anderen die vielleicht hier stumm mitgelesen haben.

    Schönes Restwochenende noch ... 😉

    Problem gelöst ....


Anmelden zum Antworten