[Qt] QTextEdit Texterscheinung verändern und Undo-Möglichkeit beibehalten?



  • Hallo,

    ich versuche gerade, für eine sehr einfache Programmierumgebung eine Funktion zu schreiben, die falsche Zeilen rot hinterlegt. Es sollen sich bei den Programmen auch nur um wenige Zeilen handeln. (1 Zeile = 1 Befehl)
    Allerdings sind die Undo-/Redo-Möglichkeiten durch die Einfärbung der Character disabled. Ich habe zuvor versucht, den gesamten Inhalt der QTextEdit jedes Mal als HTML-String neu zu generieren, allerdings war das komplexer und funktionierte nicht besser.

    Der Code-Ausschnitt zum Einfärben sieht bisher wie folgt aus: (wobei ich voraussichtlich noch einige Optimierungen vornehmen werde)

    int line = 0;
    
    for(int i = 0; i < route_code.size(); ++i)
    {
        if(route_code[i] == '\n') ++line;
        else
        {
            QTextCursor tmp_cur(edit->document());
            tmp_cur.setPosition(i+1);  //the character is before the cursor
            tmp_cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor);
          	QTextCharFormat format = tmp_cur.charFormat();
    
            if(!statements[line].GetError().isEmpty())
            {
              format.setBackground(QBrush(QColor(0xFF, 0x88, 0x88)));
            }
            else
            {
                format.setBackground(QBrush(QColor(0xFF, 0xFF, 0xFF)));
            }
    
            tmp_cur.setCharFormat(format);
        }
    }
    

    Er steht bisher in einem Slot, der mit dem Signal contentsChange() der betreffenden QTextEdit connected wurde.

    Kennt ihr einen Weg, um Strg-Z und Strg-Y mit Highlighting-Verhalten zu ermöglichen?

    mfg
    wxSkip



  • Update: Ein Undo ist zwar verfügbar, wenn ich aber z.B. "asdf" eintippe und Strg-Z drücke, dann wird mein Slot mit position = 0, charsAdded = 4 und charsRemoved = 4 aufgerufen und es passiert nichts. Auch ein Redo ist danach nicht verfügbar.

    Ich habe meinen Code jetzt leicht verändert, damit er zeilenweise einfärbt:

    int line = 0;
    int last_line_start_position = 0;
    int i = 0;
    
    while(true)  //we'll jump out at the end
    {
        if(i >= route_code.size() || route_code[i] == '\n')
        {
            QTextCursor tmp_cur(edit->document());
            tmp_cur.setPosition(i);  //the character is before the cursor
            tmp_cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor, i - last_line_start_position);
            QTextCharFormat format = tmp_cur.charFormat();
    
            if(!statements[line].GetError().isEmpty())
            {
                html_error_string += statements[line].GetError() + "<br />";
                format.setBackground(QBrush(QColor(0xFF, 0x88, 0x88)));
            }
            else
            {
                 format.setBackground(QBrush(QColor(0xFF, 0xFF, 0xFF)));
            }
    
            tmp_cur.setCharFormat(format);
    
            if(i == route_code.size()) break;
    
            ++line;
            last_line_start_position = i+1;
        }
    
        ++i;
    }
    

    EDIT: Wenn ich nur noch ein Zeichen habe und dieses lösche, dann kann man diesen Schritt rückgängig machen.
    EDIT2: Wenn ich am Ende der Zeile ein Wort schreibe und das dann rückgängig mache, dann springt der Cursor vor das Wort, das Wort ist aber noch da.



  • Warum nimmst du nicht gleich den QSyntaxHighlighter?



  • Sensai_ schrieb:

    Warum nimmst du nicht gleich den QSyntaxHighlighter?

    Danke, damit funktioniert es super!


Anmelden zum Antworten