Projet

Général

Profil

QTextCursor

Comment gérer les manipulations sur le texte dans un widget tel que QTextEdit ?
Une solution passe par l'utilisation d'un curseur dont le type est QTextCursor. Cet objet est vraiment très (trop ?) complet. Il permet de gérer les déplacements, de caractère en caractère, de mot en mot... dans tous les sens. Il a deux attributs int anchor et int position qui permettent de définir les sélections (tous les caractères compris entre anchor et position. On peut appliquer à la sélection tout un tas de choses dont un QTextCharFormat permettant de définir la Font, les couleurs...

Un peu de code

  • Récupérer un curseur à la position courante de la souris dans le QTextEdit
      QTextCurseur m_curseur;
      m_curseur=textEdit->textCursor();
      int m_curseurPosition = m_curseur.position();
    
On récupère la position du curseur texte dans la chaine affichée dans le QTextEdit.
  • Déplacer le curseur dans le texte
    Les fonctions de déplacement sont nombreuses :
    setPosition(int pos, QTextCursor::MoveAnchor)
    

    permet de placer le curseur à la position absolue dans le texte pos.
    anchor est déplacée avec le curseur : il n'y a donc pas de sélection. Pour en avoir une, moveMode doit être KeepAnchor

Il est possible de se déplacer dans le text pas à pas
bool movePosition ( MoveOperation operation, MoveMode mode = MoveAnchor, int n = 1 )

            m_curseur.movePosition(QTextCursor::Left);
            textEdit->setTextCursor(m_curseur);

le curseur est déplacé d'un caractère vers la gauche, puis affiché à sa nouvelle position

  • Créer une sélection
    pour ce faire, il faut que anchor reste à une position donnée (celle où commence le déplacement)
            m_curseur.movePosition(QTextCursor::Right,QTextCursor::KeepAnchor,10);
    

    Le curseur se déplace 10 fois vers la droite (3° paramètre), anchor reste à sa place (2° paramètre)
  • Appliquer un formatage à la sélection
    Notre curseur texte contenant une sélection, il est possible de la modifier, par exemple mettre le fond en rouge (pour Annie)
        QTextCharFormat textFormatErreur;
        textFormatErreur.setBackground(QBrush(QColor(255,0,0)));
        m_curseur.setCharFormat(textFormatErreur);
        m_curseur.clearSelection();
        textEdit->setTextCursor(m_curseur);

On va appliquer un QTextCharFormat au curseur (qui contient une sélection)

La doc concernant ces objets est bien détaillée mais conséquente vu la richesse du sujet !!!

Redmine Appliance - Powered by TurnKey Linux