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 :

HighlightingRule et QtextEdit


Sujet :

Qt

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut HighlightingRule et QtextEdit
    Bonjour,

    J'ai un textEdit avec un contenue dans lequel je met en darkBlue toutes les ligne contenant le mot "FIELD_MAP" avec le bout de code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      HighlightingRule rule;
      QStringList keywordPatterns;
     
      keywordFormat.setFontWeight(QFont::Bold);
      keywordFormat.setForeground(Qt::darkBlue);
      keywordPatterns.clear();
      keywordPatterns << "\\bFIELD_MAP[^\n]*\\b";
      foreach (QString pattern, keywordPatterns) {
        rule.pattern = QRegExp(pattern);
        rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
        rule.format = keywordFormat;
        highlightingRules.append(rule);
      }
    Ca fonctionne bien à l'execption de 2 choses que je n'arrive pas à realiser, et pourtant j'ai bien lue l'aide sur "QRegExp"

    - Je voudrait que cette regle ne s'applique pas si il y a un ';' devant le mot FIELD_MAP.
    - et enfin, quand je rencontre le mot clef toute la ligne est coloré jusqu'a la fin, mais pas le contenu de la ligne avant le mot clef.

    Pensez-vous qu'il y a moyen de réaliser ces 2 conditions
    Merci d'avance

  2. #2
    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,

    1. Bienvenue dans le monde des regexp; pour t'aider à traverser les terres de ce langage hostile, prend grand soin de l'aide mémoire, et lis cette page de l'indispensable regular-expressions.info.
    La solution à ton problème se nomme "Negative lookbehind" et y est détaillée. Mais le problème est que c'est pas (encore?) supporté par Qt... Donc, le workaround à appliquer est: lorsque le texte est matché, tu vérifies si le caractère précédent est un ';'. S'il ne l'est pas, c'est bon, sinon, tu t'arrêtes là.

    2. L'exemple dont tu reprends le code fait à 1 variable près ce qu'il te faut. Indice, c'est dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setFormat(index, length, rule.format);

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci pour tes liens
    J'ai beau modifier l'example comme tu me suggeres mais pour l'instant sans réussite!

  4. #4
    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
    C'est à dire? Qu'est ce que je t'ai suggéré?

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    J'avais cru comprendre quand mettant une condition sur la fonction "setFormat" je pouvais m'en sortir. mais visiblement c'est pas si simple

  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
    Réfléchis... C'est quoi index ? length ?

  7. #7
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    J'ai bien saisi cette fonction, mais ce que je voudrais réaliser est un peu plus compliqué que y mettre une condition.
    En fait je voudrait reproduire l'effet d'un editeur de code c++ comme dans l'example à la difference que quand je tape '/*' tout est grisé jusqu''à la fin mais quand je met ';/*' plus rien ne se passe

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Tu peut mettre ton keywordPatterns que tu utilise et un bout de texte?

  9. #9
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    J'ai donc repris l'example de QT4 et remplacé '/*' par 'end' et '\*' par 'endding'
    ca fonctionne bien, sauf si entre les 2 il y a ';end' ce qui arrete le grisage. Je voudrais exclure de la régle ';end'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      multiLineCommentFormat.setForeground(Qt::gray);
      commentStartExpression = QRegExp("\\bend\\b");
      commentStartExpression.setCaseSensitivity(Qt::CaseInsensitive);
      commentEndExpression = QRegExp("endding");

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Si j'ai bien compris, tu as repris l'exemple de Qt en l'adaptant avec le morceau de code.

    Peut tu mettre un exemple du texte??

  11. #11
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    quelque chose comme ca:
    Ne m'en veut pas, j'ai trés peu d'imagination !

    tutu
    toto
    end
    titi
    titi
    titi
    ;end
    tutu
    ttu


    donc à partir du 'end' tout est grisé, et devrait l'etre jusqu'a la fin, mais le grisage se stop à ';end' qui correpond à un commentaire chez moi et ne devrait pas avoir d'effet

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    tu as un truc comme
    tutu
    toto
    end
    titi
    titi
    titi

    ;end
    tutu
    ttu
    ??
    Ou utilise tu
    QRegExp("\\bend\\b");
    QRegExp("endding");

  13. #13
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    voici les bouts de codes associés:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Highlighter::Highlighter(QTextDocument *parent)  : QSyntaxHighlighter(parent)
    {
      HighlightingRule rule;
      QStringList keywordPatterns;
    ...
    ...
     
      multiLineCommentFormat.setForeground(Qt::gray);
      commentStartExpression = QRegExp("\\bend\\b");
      commentStartExpression.setCaseSensitivity(Qt::CaseInsensitive);
      commentEndExpression = QRegExp("endding");
     
    }
     
     
    void Highlighter::highlightBlock(const QString &text)
    {
     
        foreach (HighlightingRule rule, highlightingRules) {
            QRegExp expression(rule.pattern);
            int index = text.indexOf(expression);
            while (index >= 0) {
                int length = expression.matchedLength();
                setFormat(index, length, rule.format);
                index = text.indexOf(expression, index + length);
            }
        }
        setCurrentBlockState(0);
     
     
        if (text==";end" || text==";END") return;
        int startIndex = 0;
        if (previousBlockState() != 1)
            startIndex = text.indexOf(commentStartExpression);
     
        while (startIndex >= 0) {
            int endIndex = text.indexOf(commentEndExpression, startIndex);
            int commentLength;
            if (endIndex == -1) {
                setCurrentBlockState(1);
                commentLength = text.length() - startIndex;
            } else {
                commentLength = endIndex - startIndex  + commentEndExpression.matchedLength();
            }
            setFormat(startIndex, commentLength, multiLineCommentFormat);
            startIndex = text.indexOf(commentStartExpression,startIndex + commentLength);
        }
    }

  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
    Ca peut-être?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commentStartExpression = QRegExp("\\b[^;]end\\b");

  15. #15
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Avec cette ligne il ne detecte plus du tout les 'end'!

  16. #16
    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
    En effet, j'y ai pas assez réfléchi. C'est crâmé pour la solution full regex, je te renvois à ce que j'ai dis plus haut, c-a-d vérifier le caractère précédent end (ou les autres token concernés).

  17. #17
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    ouai, faut que je fouille de ce coté là, effectivement.
    Merci de tes suggestions

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Je viens de tester l'example dans Qt 4.4.
    Je n'ai pas ton problème. Voici ce que j'ai changé :
    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
     
    //! [3]
        singleLineCommentFormat.setForeground(Qt::darkRed);//ici pour voir la difference
        rule.pattern = QRegExp(";[^\n]*"); //ici
        rule.format = singleLineCommentFormat;
        highlightingRules.append(rule);
     
        multiLineCommentFormat.setForeground(Qt::red);//ici pour voir la difference
    //! [3]
     
    ...
    //! [6]
        commentStartExpression = QRegExp("\\bend\\b");//ici
        commentEndExpression = QRegExp("\\bendding\\b");//ici
    }
    //! [6]
    Je te laisse regarder le code.
    EN gros il utilse setCurrentBlockState() et previousBlockState() pour savoir si il est en commentaire globale

  19. #19
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci Maugaulois, pour ton bout de code, sauf qu'a part la couleur c'est exactement mon code, donc le comportement reste le même, dé qu'il rencontre ';end' la couleur 'red' s'arrete alors que je ne le veux pas

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Merci Maugaulois, pour ton bout de code, sauf qu'a part la couleur c'est exactement mon code,
    pas avec le code que tu nous as montré....

    Peut etre que le code dans la version Qt4.4 est un peu differente

Discussions similaires

  1. QTextEdit, Qt Designer et Python
    Par dotten dans le forum PyQt
    Réponses: 1
    Dernier message: 29/03/2008, 14h59
  2. QTextEdit : Changer la couleur du text
    Par julien89 dans le forum Qt
    Réponses: 4
    Dernier message: 21/01/2008, 20h46
  3. recuperer texte QTextEdit
    Par sebatlante dans le forum Qt
    Réponses: 5
    Dernier message: 04/01/2008, 13h57
  4. Récupèrer un contenu QTextEdit
    Par wystan dans le forum Qt
    Réponses: 2
    Dernier message: 01/05/2007, 23h48

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