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 :

QTextCursor et insertion de HTML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut QTextCursor et insertion de HTML
    Bonjour

    Je récupère du texte sélectionner avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString selection = descTextEdit->textCursor().selectedText();
    Ensuite je modifie la sélection pour lui ajouter une balise html(<b> par exemple) et ensuite je l'insère pour remplacer la sélection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    descTextEdit->textCursor().insertHtml(selection);
    Mon problème c'est que je n'ai aucune idée de comment faire pour récupérer le text pour savoir si la sélection est déja en gras. Donc une fois que j'insère "<b>Allo</b>" je ne suis pas capable de récupérer cette chaine exacte.

    La fonction selectedText() ne renvoie que Allo alors que selection().toHtml() renvoie un fragment HTML qui contient un énorme bout de code HTML.

    Comment puis-je faire?

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Tu peux peut être tester la présence des balises en début et fin de chaîne avec QString::startsWith et QString::endsWith et récupérer la sélection sans les balises avec QString::mid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (selection.startsWith("<b>") && selection.endsWith ("</b>"))
        // le texte sélectionné n'est pas en gras
    else
    {
        // le texte sélectionné est en gras
        // on supprime les balises :
        selection = selection.mid(3, selection.length() - 7);
    }
    En fait, en pratique, c'est plus compliqué que ça. Regarde les cas suivant (souligné = le texte sélectionné) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <b>du texte mis en gras</b> mais pas là.
    <b>beaucoup de texte mis en gras.</b>
    Beaucoup moins <b>de texte</b> mis en gras.
    Bon courage

  3. #3
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Je ne vois pas de solution miracle à ton problème. Tu peux néanmoins créer une fonction qui nettois un peu le .toHtml() avec les balises que tu veux garder.

    Un exemple avec les balises de mise en forme de base :

    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
    QString toSimpleHtml() const
    {
        QString html;
        for (QTextBlock block = document()->begin(); block.isValid();
             block = block.next()) {
            for (QTextBlock::iterator i = block.begin(); !i.atEnd();
                 ++i) {
                QTextFragment fragment = i.fragment();
                if (fragment.isValid()) {
                    QTextCharFormat format = fragment.charFormat();
                    QColor color = format.foreground().color();
                    QString text = Qt::escape(fragment.text());
                    QStringList tags;
                    if (format.verticalAlignment() ==
                        QTextCharFormat::AlignSubScript)
                        tags << "sub";
                    else if (format.verticalAlignment() ==
                             QTextCharFormat::AlignSuperScript)
                        tags << "sup";
                    if (format.fontItalic())
                        tags << "i";
                    if (format.fontWeight() > QFont::Normal)
                        tags << "b";
                    if (format.fontStrikeOut())
                        tags << "s";
                    while (!tags.isEmpty())
                        text = QString("<%1>%2</%1>")
                                       .arg(tags.takeFirst()).arg(text);
                    if (color != QColor(Qt::black))
                        text = QString("<font color=\"%1\">%2</font>")
                                       .arg(color.name()).arg(text);
                    html += text;
                }
            }
        }
        return html;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut
    Merci, je verrais à poster une solution lorsque j'aurais travailler dessus.

    Entre temps, j'ai un autre problème qui me pré-occupe un peu, lorsque j'insère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QString url = QInputDialog::getText(this, "Place your link", "URL: ");
    descTextEdit->textCursor().insertHtml("<a href='http://"+url+"'>"+url+"</a>");
    Le liens est formater et placé dans mon QTextEdit, mais je suis incapable de cliquer dessus et lorsque je continue à écrire dans le QTextEdit le texte garde le format d'un lien(souligné et bleu). Je ne sais pas si je dois rafraîchir mon QTextEdit où réinitialisé le Curseur, mais un coup deuil rapide dans la doc ne pas pas vraiment trouver de réponse.

    Encore merci.

  5. #5
    Invité de passage
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 1
    Par défaut Savoir si un texte est en gras
    Sinon, il ya une solution, tu verifie que le texte est en gras avant de le convertir en Html.

    Voici un extrait d'un de mes codes, les variables ne sont surement pas cohérente avec les variables de l'exemple.

    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
    void FenetrePrincipale::selectionChange()
    {
        //On récupère le format actuel (en gras, en souligné, en italique)
        QTextCharFormat actuelFormat = zoneDeveloppement->currentCharFormat();
        //Pour information zoneDeveloppement est un objet de type QTextEdit
     
        //On vérifie si le texte est en gras
        if (actuelFormat.fontWeight() == QFont::Bold)
        {
            //On sait que le texte est en gras
        }
     
        else
        {
            //Le texte n'est pas en gras
        }
     
       //On vérifie si le texte est souigné
        if (actuelFormat.fontUnderline())
        {
            //Le texte est souligné
        }
     
        else
        {
            //Le texte n'est pas souligné
        }
     
        //On vérifie si le texte est en italique
        if (actuelFormat.fontItalic())
        {
            //Le texte est en italique
        }
     
        else
        {
            //Le texte n'est pas en italique
        }
    }

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 302
    Par défaut tester caractères gras dans textcursor
    Bonjour,

    La solution serait peut être de récuperer le blockFormat du curseur, de là récupérer le Qfont avec currentFont, Qfont a une propriété weight qui retourne un int pouvant avoir la valeur QFont::Bold que tu peux tester.

    J'ai essayé de faire un code en conséquence mais je bloque à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QTextBlockFormat format=cursor->blockFormat();
    qui me retourne l'erreur suivante à la compilation :
    base operand of '->' has non-pointer type 'QTextCursor'

    si je trouve viendrais compléter, sinon j'espère t'avoir aidé
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 302
    Par défaut suite je suis pas réveillé ...
    Voici un code qui compile mais qui n'est pas encore opérationnel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QTextCursor cursor=bloctexte->textCursor();  // recup curseur
    QTextCharFormat format=cursor.blockCharFormat();
    QFont font=format.font();
    if (font.weight()==QFont::Bold) qDebug<<"cararactere gras\n"
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. insertion code html dans une animation flash
    Par 3adoula dans le forum Flash
    Réponses: 2
    Dernier message: 29/08/2006, 10h12
  2. Réponses: 4
    Dernier message: 21/06/2006, 16h09
  3. [MFC][DEBUTANT] Prob insertion page html
    Par bikette63 dans le forum MFC
    Réponses: 10
    Dernier message: 24/03/2006, 11h05
  4. Insertion code html avec javascript
    Par totoranky dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/02/2006, 16h04
  5. Insertion code html dans bdd
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/04/2004, 15h03

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