IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

indentation automatique dans un QTextEdit


Sujet :

Qt

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut indentation automatique dans un QTextEdit
    Bonjour,

    Alors voila, pour un projet étudiant où l'on doit réaliser un éditeur web en QT
    (Et notre enseignement ce résume aux tutoriaux de trolltech )
    je m'occupe actuellement de réaliser l'indentation automatique du code.

    J'ai d'abord réaliser ce début de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include "New.h"
    using namespace std;
    New::New (QWidget *parent)
           : QTextEdit(parent) {
           connect(this , SIGNAL(textChanged ()), this, SLOT(indent());
    }
     
     void New::indent(){
     int indent = 0; //varriable d'indentation nb de tabulation
     QTextCursor pos = textCursor ()  //position actuelle du curseur
     for (int i=0; i<pos+1;i++) {
       QString str = //recherche d'une expretion reguliere de type <html> avec QRegEx "<.*>"
       if (str != NULL){
         QString temp = //QRegEx />
         if (temp == NULL){
           temp = //QRegEx </
           if (temp != NULL){indent--;}
           else {indent++;}
         }
       }
       ligne actuelle du curseur -> insertblock() * indent;
     }
    }
    j'ai vu qu'il existait scintilla mais je ne peut pas l'utiliser dans le projet.

    j'ai donc une première question:
    -Comment récupérer les lignes du QTextEdit jusqu'à la position actuelle du curseur et leur appliquer une regex une par une?

    Merci de l'attention que vous porterez a mon problème.

  2. #2
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Tout ce que je peux te dire concerne le curseur.

    Tu récupère un QTextCursor depuis le QtextEdit, et ensuite avec le textCursor tu récupère la position :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    QTextEdit edit;
    ...
    ...
     
    QTextCursor cursorEdit = edit.textCursor();
     
    int pos = cursorEdit.position();
    tu peux donc connaître là où se trouve son curseur dans le QTextEdit. Tu peux donc venir récupérer la ligne où il se trouve, le texte qui le précède, le suit....

    Je ne sais pas ce qu'est une regex par contre

    Edit:
    après avoir lu ton code, je crois savoir à quoi "regex" correspond

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par cayou66 Voir le message
    Je ne sais pas ce qu'est une regex par contre
    Regex je pense que c'est expression régulière.

    [EDIT] desolé cayou66 j'avais pas vu ton EDIT.

  4. #4
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    J'en étais sûr

    Je suis plutôt lent à la détente

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    je vais regarder les mouvement de curseurs
    et ouioui regex => QRegexp expretion régulière

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Utiliser des REs pour le parsing d'un fichier me paraît hautement improbable... C'est quelle expression que tu veux appliquer à chaque ligne ?

  7. #7
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Eclaires moi, "REs" ??

  8. #8
    Membre habitué Avatar de sardik
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 135
    Points : 143
    Points
    143
    Par défaut
    Il veux dire : Regular Expressions

  9. #9
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Décidément, ces expressions régulières c'est pas mon truc...

  10. #10
    Membre habitué Avatar de sardik
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 135
    Points : 143
    Points
    143
    Par défaut
    Il faut s'y mettre, c'est l'avenir de la planète ! ....

  11. #11
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par sardik Voir le message
    Il faut s'y mettre, c'est l'avenir de la planète ! ....
    Faut faire du Flex et Bison

  12. #12
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par cayou66 Voir le message
    Faut faire du Flex et Bison
    C'est à dire j'ai pas compris ?

  13. #13
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Je suis juste dans mon trip

    Flex en particulier s'appuie sur des expressions régulières, d'où la citation

    [/HS]

  14. #14
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par sardik Voir le message
    Il faut s'y mettre, c'est l'avenir de la planète ! ....
    Absolument pas ; une grosse partie des problèmes appliquées aux chaînes de caractères peuvent êtres résolues sans regex et de façon nettement plus efficace (écrire une regex c'est pas évident, la modifier, encore moins, et écrire une regex efficace et solide est tout un art).

    Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.

    --Jamie Zawinski, in comp.lang.emacs
    Edit: pour préciser, au cas où, je ne dis pas les regex sont le mal incarné, je dis juste qu'il faut les utiliser à bon escient (comme tout outil )

  15. #15
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Absolument pas ; une grosse partie des problèmes appliquées aux chaînes de caractères peuvent êtres résolues sans regex et de façon nettement plus efficace (écrire une regex c'est pas évident, la modifier, encore moins, et écrire une regex efficace et solide est tout un art).

    Edit: pour préciser, au cas où, je ne dis pas les regex sont le mal incarné, je dis juste qu'il faut les utiliser à bon escient (comme tout outil )
    C'est très sage ce que tu dis IrmatDen et je suis entierement d'accord.

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    On veut faire une indentation automatique , et on est partit sur l'idée de "détecter" les ouvertures de balises pour une programmation html par exemple.
    C'est pour cela qu'on veut utilisé un Rex.

    Tu pense que cela est une mauvaise idée ?

  17. #17
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Oui, avant que vous sachiez en écrire des solides, la moindre entrée malformée pétera complétement votre parser. Et suivant les lois de Murphy, ça arrivera le jour où votre prof testera le projet, même si vous l'avez testé plusieurs fois.

    En gros, vous voulez faire l'indentation uniquement si le premier caractère différent d'un espace est un '<', c'est ça ?
    Dans ce cas, un simple test de ce type suffirait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QString line;
    if (line.trimmed()[0] == '<')
        <procéder à l'indentation>
    Sinon, plus de détails stp, voire votre cas d'utilisation actuel et le résultat attendu

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Oui, avant que vous sachiez en écrire des solides, la moindre entrée malformée pétera complétement votre parser. Et suivant les lois de Murphy, ça arrivera le jour où votre prof testera le projet, même si vous l'avez testé plusieurs fois.

    En gros, vous voulez faire l'indentation uniquement si le premier caractère différent d'un espace est un '<', c'est ça ?
    Dans ce cas, un simple test de ce type suffirait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QString line;
    if (line.trimmed()[0] == '<')
        <procéder à l'indentation>
    Sinon, plus de détails stp, voire votre cas d'utilisation actuel et le résultat attendu
    En fait c'est presque ça, si on souhaite utiliser une RegExp c'est parsque les balise sont du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <BLABLA>
       <BLIBLI>
           <COUCOU />
       </BLIBLI>
    </BLABLA>
    et donc que le caractère'<' ne signifie pas directement une indentation.

  19. #19
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Malheureusement, ton exemple indique le contraire. C'est pour ça que je demandais plus de détails ainsi que votre cas d'utilisation et résultat attendu.

    Edit: Si c'est seulement la fin de balise qui te gêne, c'est un simple test en plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QString line;
    // [...]
    QString trimmedLine = line.trimmed();
    if (trimmedLine[0] == '<')
    {
        if (trimmedLine[1] == '/')
            <procéder à une désindentation>
        else
            <procéder à l'indentation>
    }

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    dans cette derniere version, on ne traite pas les cas des balise vide
    <img src="blabla" />
    qui ne doivent pas provoquer d'indentation, sachant qu'il existe ennormement de balise vide <br/> <hr/> etc ...

Discussions similaires

  1. QTextEdit + indentation automatique
    Par nada114 dans le forum Qt
    Réponses: 3
    Dernier message: 17/12/2008, 14h56
  2. [JDevelopper] Comment indenter automatiquement le code ??
    Par Bicnic dans le forum JDeveloper
    Réponses: 5
    Dernier message: 03/08/2004, 21h11
  3. Réponses: 2
    Dernier message: 11/05/2004, 11h17
  4. Scroll automatique dans un JTextPane
    Par regbegpower dans le forum Composants
    Réponses: 9
    Dernier message: 11/11/2003, 09h24
  5. indentation automatique
    Par Boosters dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/07/2003, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo