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 :

Passage d'un QString à un char* !


Sujet :

Qt

Vue hybride

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut Passage d'un QString à un char* !
    salut, ma question parait simpliste mais c'est un véritable calvaire ou alors je passe à coté d'un truc.
    je dois passer mon QString en char* pour l'utiliser en argument d'une fonction (écrite en C).
    Un petit tour dans la doc Qt et on peut voir qu'il n'y a pas de fonction qui fait ça mais les méthodes data() et constdata() renvoient le contenu du QString en QChar*. Les méthodes toAcsii et toLatin1 de la classe QChar permettent de renvoyer la valeur du caractère en char.
    A partir de ce constat j'ai essayé d'écrire la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const QChar *qchar = stringqt.constData();
    char *monchar = new char[stringqt.size()];
    for (int i=0; i<stringqt.size(); i++)
            *(monchar+i) = (qchar+i)->toAscii(); //ou ->toLatin1
     
    return monchar;
    et là j'ai bien ma chaine correspondant à mon QString mais j'ai en plus une 15aine de caractères rajoutés en fin de chaine sans raison particulière (alors que j'alloue la bonne taille) c'est vraiment bizarre?! voyez vous une faute dans l'algo?
    un moyen plus simple?
    merci

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    QString::toLocal8Bit()te retourne une QByteArray, soit un tableau de valeurs de 8 bits ... rien d'autre finalement qu'un tableau de char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QString* monString = new QString("abcdef");
    char* str = monString->toLocal8Bit().data();
    printf("mon string est: '%s'", str);
    PS: même principe pour toLatin1 et toAscii.

  3. #3
    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
    Tu peut aussi passer par une std:: string :
    http://qt.developpez.com/doc/4.4/qstring/#tostdstring

    Attention au problème d'encodage. toLocal8Bit est surement le plus adapté
    http://qt.developpez.com/doc/4.4/qstring/#tolocal8bit

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    merci pour vos réponses, j'ai des résultats très louches :
    -comme je l'ai dit la fonction que j'ai écrit fonctionne mais la chaine comporte des caractères en plus (des caractères bizarre î etc)
    -la méthode proposée avec toLocal8Bit() me donne en sortie une chaine très longue avec des caractères bizarres

    - la seule chose qui marche est de passer par toStdString().data()

    les mystères de l'informatique...

    peut-etre y-a t'il des réglages à faire au niveau des jeux de caractères ?

  5. #5
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Aucun mystère à cela, la doc Qt est explicite sur le sujet:

    The returned byte array is undefined if the string contains characters not supported by the local 8-bit encoding.
    Pour convertir un caractère qui n'a pas d'équivalent en ascii, il te faudra passer par un QTextCodec.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Par défaut
    - le tableau retourné n'est pas "undefined" mais comporte bien environ un millier de caractères : des î et un symbole que je n'ai jamais vu avant

    - ça n'explique pas non plus les résultats que j'obtiens par la méthode que j'ai proposé

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

Discussions similaires

  1. Convertir char vers QString
    Par darkwall_37 dans le forum Débuter
    Réponses: 3
    Dernier message: 25/05/2009, 11h49
  2. Formatage lors du passage d'un type NUMBER à un type CHAR
    Par LARS14 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/08/2008, 16h20
  3. Conversions implicites de QString en const char*
    Par mister3957 dans le forum C++
    Réponses: 3
    Dernier message: 22/08/2008, 17h27
  4. passage de char en int
    Par liverbird dans le forum C++
    Réponses: 5
    Dernier message: 21/01/2008, 16h07
  5. Conversion QString en char*
    Par Stage2006 dans le forum Qt
    Réponses: 5
    Dernier message: 12/06/2007, 17h14

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