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

Discussion :

Couleur spécifique pour chaque caractère d'un QString

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut Couleur spécifique pour chaque caractère d'un QString
    Bonjour à tous!
    Je sollicite votre aide.
    Je suis en possession d'un QString pour lequel je voulais attribuer une couleur à chacune de ses caractères.
    Prenons un exemple:
    Je voulais que chaque fois que le caractère 'L" est rencontré, qu'il lui soit attribuée la couleur verte. La couleur jaune pour '&', la couleur jaune pour 'T',et ainsi de suite...
    J'ai pense à str.setStyleSheet("QLabel{color::green}") par exemple, mais dans ce cas, ce sont tous les caractéres qui seront verts.
    Je vous serai gré si vous m'aidiez á contourner cette difficulté.
    Merci d'avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Un article a été traduit il y a peu, sur la coloration syntaxique : http://qt-quarterly.developpez.com/q...que-qtextedit/, apparemment sinon il faut utiliser QTextCharFormat.

    L'autre technique connue pour information, c'est le HTML (<font color="green">L</font>, remplacée d'ailleurs par Qt par un <span style="color: green">L</span> plus propre si je ne me trompe pas).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Merci Troudhyl pour ton aide.
    Je me dois de lire la classe QSyntaxHighlighter et l'appliquer dans ce cas. Elle pourra faire l'affaire.

    Merci une fois de plus.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    J'ai lu le cours sur la classe QSyntaxHighlighter, mais je ne m'enssors toujours pas avec le probléme.
    En effet, j'ai fait ceci:
    1- J'ai écrit plutôt les deux lignes suivantes, puisqu'il est dit dans le cours qu'il faut sous-classer QSyntaxHighlighter et initialiser cette classe avec QTextEdit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QTextEdit text;
    text = "L&TG3J"
    2- Dans le fichier .cpp, j'ai passé text en argument de la methode highlightBlock().
    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
    void maCalsse::highlightBlock(text)
    {
        for (int i = 0; i < text.length(); ++i) {
            if (text.at(i)== Qchar('L')
            {
                setFormat(i, 1, Qt::green);
            }
            else if (text.at(i)== Qchar('&')
            {
                setFormat(i, 1, Qt::yellow);
            }
            else if (text.at(i)== Qchar('T')
            {
                setFormat(i, 1, Qt::red);
            }
        }
        out<<text<<endl;
    }
    Le probléme n'est pas toujours résolu. Je sollicite votre aide une fois de plus.
    a) text est-il passé en argument de la methode highlightBlock() comme il se doit?
    b) Ai-je bien sous-classé la classe QSyntaxHighlighter?
    c) Pourquoi le code tel que je l'ai reécrit ne fonctionne -t-il pas?
    Merci pour votre aide

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Un des gros points forts de Qt c'est sa documentation, et son intégration forte dans l'IDE Qt Creator. Par contre avant de commencer à coder en Qt, faut avoir une idée de ce qu'est la POO, et le C++ pourquoi pas.

    Pourquoi je dis ça, parce que :
    a) Le code que tu as posté n'est pas syntaxiquement correct et donc ne veut rien dire. Même si on voit à peu près ce que tu essayes de faire. Peut-être que ce sont des erreurs en copiant sur le forum mais la signature de ta fonction highlightBlock() a un problème. text visiblement tu l'utilises comme un QString (même si on ne voit nulle part sa déclaration en tant que tel), et tu le déclares en QTextEdit... Je te laisse poster un code corrigé.
    b) A toi de nous dire, ou de nous montrer le bon code, là on ne voit aucun soupçon d'indice pour répondre.
    c) Faut déjà répondre aux deux questions précédentes avant de chercher ce qui ne marche pas.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut Troudhyl et merci pour ta critique et ton éclaircissement.
    Oui, je dois avouer avoir gaffé sur le code. Tu sais, je demandes de l'aide parce que je suis limité dans ce domaine.
    La doc de QTextEdit me dit que cette classe permet d'afficher un texte.
    Donc j'écris un texte (un QString dans mon cas) et puis j'affiche donc mon texte sur la fenêtre en utilisant la fonction toPlainText() dans laquelle je passe mon QString en argument. En supposant que le texte est affiché, je peux alors le manipuler.

    J'ai donc modifié le code comme suit:

    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
    void maClasse::highlightBlock()
    {
        QTextEdit wind;
        QString text = "L&TG3J";
     
        wind.toPlainText(text);
     
        for (int i = 0; i < text.length(); ++i) {
            if (text.at(i)== Qchar('L')
            {
                setFormat(i, 1, Qt::green);
            }
            else if (text.at(i)== Qchar('&')
            {
                setFormat(i, 1, Qt::yellow);
            }
            else if (text.at(i)== Qchar('T')
            {
                setFormat(i, 1, Qt::red);
            }
        }
        out<<text<<endl;
    }

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce code compile, vraiment ? Je vois au moins une fonction et une classe qui n'existent pas. Alors soit tu mets un code qui compile, et on discute du problème de Qt si ça ne fait pas tout à fait ce que tu souhaites, soit tu t'interroges sur les erreurs de compilation, et si tu n'arrives pas à les corriger, tu reviens vers nous en indiquant l'erreur (et la ligne incriminée). Mais s'il te plait, ne mets pas de code inventé sinon on ne va pas s'en sortir...

    Pour t'aider, déjà les fonctions style toSomething() ne prennent pas de paramètre, ce sont des getters, des convertisseurs... Donc ce qui intéresse c'est la valeur de retour (Something thing = blabla.toSomething();). Les "setters" s'écrivent généralement setSomething(something). Il existent des convertisseurs fromSomething(something) aussi, sorte de combo entre set et to. Déjà en sachant ça, c'est plus facile de chercher dans la doc ou l'auto-complétion quelle fonction peut faire ce que tu veux.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut Troudhyl et merci pour ton éclaircissement.
    Je lis depuis un certain temps, mais je manque toujours le coach.
    J'ai crée un widget (m_monTexte) pour afficher le texte á colorier)
    Avec ce code, mon programme plante simplement. Peux-tu s'il te plait m'indiquer des modifications à apporter pour l'amélioration du code?
    Merci d'avance

    Fichier.h
    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
    #ifndef DEF_COLORERSEQUENCES
    #define DEF_COLORERSEQUENCES
     
    #include <QtGui>
     
    class ColorerSequences: public QSyntaxHighlighter
    {
        Q_OBJECT
     
    public:
        ColorerSequences(QTextDocument *parent);
        ~ColorerSequences();
     
    public slots:
        void highlightBlock(const QString &text);
     
    private:
        QTextEdit *m_monTexte;
     
    };
    #endif
    Fichier.cpp
    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
    #include "ColorerSequences.h"
     
    ColorerSequences::ColorerSequences(QTextDocument *parent = 0): QSyntaxHighlighter(parent)
    {
        m_monTexte = new QTextEdit;
        m_monTexte->setFixedSize(300, 127);
    }
     
    void ColorerSequences::highlightBlock(const QString &text)
    {
        for(int i = 0; i<text.size(); i++)
        {
            if(text.at(i) == QChar('A'))
            {
                setFormat(i, 1, Qt::green);
            }
            else if(text.at(i) == QChar('C'))
            {
                setFormat(i, 1, Qt::blue);
            }
            else if(text.at(i) == QChar('T'))
            {
                setFormat(i, 1, Qt::red);
            }
        }
     
    }
     
    ColorerSequences::~ColorerSequences()
    {
     
    }

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Le code présenté n'a rien de particulier, ce n'est pas lui qui doit faire "planter". (ça plante avec quelle erreur, à quelle ligne du code ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTextDocument *parent = 0
    C'est dans le .h qu'on met généralement les valeurs par défaut, pas dans le .cpp.

    Le QTextEdit, tu ne t'en sers pas, tu le crées sans parent et malgré ça tu ne le détruis jamais. Donc il n'a rien à faire là. ColorerSequences est une classe-outil, pas graphique. J'imagine que dans une de tes classes graphiques (widget) tu vas l'instancier en lui passant un textEdit->document() en paramètre.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut Troudhyl et merci pour ton éclaircissement. Je dois avouer que cette partie me casse vraiment, mais je me dois de la comprendre, j'espère avec ton aide.
    Je suis un peu perdu avec l'implémentation de ma classe-outil (ColorerSequences). Ai-je raison de croire que son constructeur doit rester vide?
    Ma fenetre principale s'ouvre, mais lorsque je clique pour acceder à la zone texte, ca plante et le message d'erreur est le suivant: "MaFenetre.exe a quitté avec le code -1073741819"

    Je te serai gré si tu me donnais plus d'éclaircissement pour contourner la difficulté.
    Merci d'avance

    Fichier ColorerSequences.h
    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
    #ifndef DEF_COLORERSEQUENCES
    #define DEF_COLORERSEQUENCES
     
    #include <QtGui>
     
    class ColorerSequences: public QSyntaxHighlighter
    {
        Q_OBJECT
     
    public:
        ColorerSequences(QTextDocument *parent = 0);
        ~ColorerSequences();
     
    public slots:
        void highlightBlock(const QString &text);
     
    private:
     
     
    };
    #endif
    Fichier MaFenetre.h
    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
    #ifndef DEF_MAFENETRE
    #define DEF_MAFENETRE
     
    #include <QtGui>
    #include "ColorerSequences.h"
     
    class maFenetre: public QMainWindow
    {
        Q_OBJECT
     
    public:
        maFenetre();
        ~maFenetre();
     
    public slots:
     
     
    private:
        QWidget *m_zoneCentrale;
        QTextEdit *m_monTexte;
        ColorerSequences *colorerSequences;
     
    };
    #endif
    Fichier ColorerSequences.cpp
    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
    #include "ColorerSequences.h"
     
    ColorerSequences::ColorerSequences(QTextDocument *parent): QSyntaxHighlighter(parent)
    {
     
    }
     
    void ColorerSequences::highlightBlock(const QString &text)
    {
        for(int i = 0; i<text.size(); i++)
        {
            if(text.at(i) == QChar('A'))
            {
                setFormat(i, 1, Qt::green);
            }
            else if(text.at(i) == QChar('C'))
            {
                setFormat(i, 1, Qt::blue);
            }
            else if(text.at(i) == QChar('T'))
            {
                setFormat(i, 1, Qt::red);
            }
        }
     
    }
     
    ColorerSequences::~ColorerSequences()
    {
     
    }
    Fichier MaFenetre.cpp
    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
    #include "MaFenetre.h"
    #include "ColorerSequences.h"
     
    MaFenetre::MaFenetre()
    {
        m_zoneCentrale = nee QWidget;
        m_zoneCentrale->setFixedSize(400,200);
        m_monTexte = new QTextEdit(this);
        m_monTexte->setFixedSize(300, 127);
     
        setCentralWidget(m_zoneCentrale);
        colorerSequences = new ColorerSequences(m_monTexte->document());
     
    }
     
     
     
    MaFenetre::~MaFenetre()
    {
     
    }

  11. #11
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Après ta modification d'aujourd'hui, ce code me parait pas mal (à part le nee QWidget), ça plante toujours ?

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut Troudhyl et merci pour ta réaction.
    Je suis vraiment coincé avec ce code.
    Non, ca ne plante plus, mais ca ne colore pas non plus. Acun caractére n'a changé de couleur jusqu'ici. Je suis un peu limité déjà.
    Ton aide me serait vraiment bénéfique.

  13. #13
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Bon j'ai fait un projet QMainWindow, j'ai recopié ton code, qui n'était pas compilable :
    - Correction du "nee"
    - Correction des majuscules à MaFenetre

    Et ça fonctionne, j'ai bien de la coloration syntaxique.


  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut Troudhyl et merci pour ton post et tes conseils. Je dois avouer que tes éclaircissements m'ont permis de résoudre le probléme.
    J'ai pu obtenir un truc tel que présenté en piéce-jointe.
    Merci une fois de plus.
    Images attachées Images attachées

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/08/2014, 15h25
  2. Couleur pour chaque cellule d'une colonne
    Par lo_schil dans le forum Composants
    Réponses: 3
    Dernier message: 03/06/2010, 11h48
  3. Réponses: 1
    Dernier message: 12/05/2010, 19h52
  4. Réponses: 7
    Dernier message: 21/02/2009, 22h22
  5. [W2000] Réseau spécifique pour chaque application
    Par SkyDev dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 01/02/2007, 10h33

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