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 :

Appliquer un lexer personalisé à un QTextEdit


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Par défaut Appliquer un lexer personalisé à un QTextEdit
    Bonjour à tous.
    Je cherche à colorer syntaxiquement certain mot d'un QTextEdit lorsqu'il sont rentrés, et de manière personnalisée. Comment-faire ?
    Merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut,
    Regarde ceci
    http://qt.developpez.com/doc/latest/qsyntaxhighlighter/
    et un exemple
    http://qt.developpez.com/doc/latest/...axhighlighter/

    Sinon il existe aussi la lib QScintilla, mais je ne connait pas trop.

  3. #3
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Par défaut
    Merci beaucoup.
    Peut-on ajouter une marge de numéro de ligne sur un QTextEdit ?
    Merci d'avance.

  5. #5
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    là comme ça je te dirais bien non je pense pas.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Il me semble Que QScintilla le fait

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Par défaut
    Il faut savoir que je découpe ma marge en 5 parties :
    • Une marge vide à gauche de 10px
    • Une marge pour les nombres de largeur variable
    • Une marge pour les marqueurs de 15px également
    • Une marge pour les lignes réductibles de 15px encore
    • Une marge vide à droite pour faire plus joli


    Pour la marge numérotée :
    On rafraîchit la taille de la marge à chaque fois que le nombre de block change (blockCountChanged()), on rafraîchit la marge elle-même lorsque c'est demandé (updateRequest()).
    Pour changer la largeur de la marge, on utilise le slot updateLineNumberAreaWidth(int newBlockCount) [avec en paramètre le nouveau nombre de blocks]. La fonction modifie la marge du viewport du QPlainTextEdit (setViewportMargins(), une fonction de QAbstractScrollArea) avec une valeur pour left égale à la largeur totale de la marge (lineNumberAreaWidth())...
    Justement, cette fonction : elle permet d'additionner toutes les largeurs des marges (réduction, gauche, droite, marqueurs, ...) avec la largeur de la marge numérotée donnée par lineNumberAreaWidthPrimar(), qui calcul la largeur de ladite marge comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Soit d le nombre de chiffres
    Soit m le maximum entre 1 et le nombre de blocks [blockCount()]
    Tant que m >= 10:
        m -> m / 10
        d -> d + 1
    Fin.
    Renvoyer [marge de gauche] + d * [largeur du caractère '9']
    En ce qui concerne updateLineNumberArea(QRect r, int dy), elle permet d'afficher les bons numéros en fonction du scroll de l'éditeur (dy) et de sa taille (r) :
    Si dy > 0, on scroll la marge au même endroit avec scroll() de QWidget, sinon on se contente de rafraîchir la marge... Enfin, si le viewport est trop grand (que le viewport de la marge peut contenir celui de l'éditeur), on rafraîchit la largeur de la marge.
    Sinon, pour dessiner la marge, on passe par la fonction lineNumberAreaPaintEvent(), détaillée plus loin.

    Pour le folding:
    La première étape consiste à trouver quelles lignes sont foldables, grâce à findFoldablesLines(), qui ne fait que chercher les débuts et fins de blocks, répertoriées dans le Lexer (cf: lexer.h, fonction blocks()), en faisant attention aux blocks imbriqués...
    La fonction remplie l'attribut _foldableLines, qui n'est autre qu'un QMap<int,int>, qui associe à une ligne qui commence le block la ligne qui le termine. (Ce map va nous être utile dans la fonction d'affichage).
    Par ailleurs, lorsque l'on clique sur la marge dans le secteur approprié, et que la ligne où on a cliqué existe dans le map _foldableLines, alors on ajoute à un autre QMap<int, int>, _foldedLines, qui regroupe les lignes réduites (si les lignes exstent déjà dans _foldedLines, on les supprime).

    La fameuse fonction lineNumberAreaPaintEvent():
    C'est THE gros morceau :
    Elle commence par remplir la marge avec une couleur, et à créer trois variables : une pour le numéro du block, une pour la position en haut, et une autre pour en bas, ainsi qu'une QStack<int> qui contiendra les lignes réduites.
    Pour chaque block valide et visible, on dessine le numéro de ligne; si la pile n'est pas vide, et que la ligne actuellement dessinée est une ligne de fin de block, on dessine un angle droit; si la pile n'est pas vide, que le numéro du block est supérieur au dessus de la pile et inférieur à la ligne de fin correspondante dans _foldableLines (que la ligne est bien dans le block en fait), on dessine une bar verticale; enfin, si la ligne actuellement dessinée est une ligne de départ, on dessine un + ou un - en fonction de si la ligne est contenue dans _foldedLines Ensuite, on avance toute les variables...

    Pour la ligne qui apparaît entre les blocks réduits, tout se passe dans le paintEvent() de CodeEdit : pour chaque ligne de _foldedLines, on dessine une ligne horizontale en bas de la ligne de départ...

    Et voilà... Si tu as une question, n'hésite pas !

    Remarque importante : en refaisant quelques essais, je me suis aperçu d'un bug avec les blocks imbriqués réduits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {//(1)
        {//(2)
            {//(3)
            }
        }
    }
    En effet, si l'on réduit un block (ex: le 3), puis que l'on réduit un block supérieur (le 2), deux lignes sont tracées au lieu d'une seule, et lorsqu'on étend le block réduit (2), le block inférieur (3) est mal détendu. Je vais travailler sur ce bug, et vous tiendrais au courent des modif' .

  8. #8
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci pour ces précisions qui permettent d'y voir un peu plus clair.

    Si je trouve du temps libre, j'essaierais de porter ton code en Python si c'est faisable. Si j'y arrive, je mettrais un lien ici.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] trouver le format personalisé appliqué a une cellule en VBA
    Par pedro91 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/09/2009, 17h56
  2. appliquer plusieurs templates
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 04/04/2003, 16h26
  3. [xsl java]Appliquer une XSL à un String contenant doc XML
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 03/04/2003, 15h46
  4. appliquer des textures de taille 2n+1
    Par Katsuo chris dans le forum DirectX
    Réponses: 4
    Dernier message: 14/11/2002, 00h11
  5. [VB6][Formulaire]Appliquer un Scrollbar a une Form
    Par Boil dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/11/2002, 03h51

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