Partage
  • Partager sur Facebook
  • Partager sur Twitter

convertir un QString en const char*

Sujet résolu
    7 mars 2008 à 18:31:05

    Bonjour,

    Voilà, je voudrais simplement ouvrir un fichier (son) après l'avoir choisi via getOpenFileName(), le problème :

    FMOD veut que je lui envoi un const char* alors que getOpenFileName() renvoi un QString.


    J'ai cherché des problèmes similaires sur d'autre forums mais les solutions ne correspondent pas, et sont souvent expliqué à base de "tu fais ça et hop!" ce qui n'aide pas pour être guidé.

    La doc' Qt renvoi à des fonctions qui ne fonctionne pas. (qui ne donne pas l'effet souhaité plutôt).

    Si vous pouviez m'indiquer le chemin et m'expliquer comment les fonctions fonctionnent, ça serait drôlement sympa.

    En espérant de l'aide, merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2008 à 18:34:16

      il faut passer par un QByteArray (toAscii) qu'on converti en char* (data) :
      1. QString s = "tralala";
      2. s.toAscii().data();
      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2008 à 18:34:52

        1. taFonction((const char*)ta_qstring.toLocale8Bit());


        Apprendre à lire une doc te serait sûrement profitable ;) .

        EDIT: Zut, grillé de 37 secondes :p .
        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2008 à 18:36:30

          ornithorynx > tu as vu cet exemple où ? (toLocale8Bit() renvoie un QByteArray et surement pas un const char* et encore moins un pointeur)
          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2008 à 18:38:03

            QByteArray définit une surcharge du cast vers const char*.

            Citation : Doc Qt

            QByteArray::operator const char * () const

            Returns a pointer to the data stored in the byte array. The pointer can be used to access the bytes that compose the array. The data is '\0'-terminated. The pointer remains valid as long as the array isn't reallocated.

            This operator is mostly useful to pass a byte array to a function that accepts a const char *.

            Note: A QByteArray can store any byte values including '\0's, but most functions that take char * arguments assume that the data ends at the first '\0' they encounter.
            See also constData().

            • Partager sur Facebook
            • Partager sur Twitter
              7 mars 2008 à 18:46:21

              Oui apprndre à lire la doc' serait bien, mais je compte y parvenir avec de l'expérience.
              Pour ta réponse minirop, merci.

              EDIT: le compilateur me renvoi ceci " error: conversion from `QString' to non-scalar type `std::string' requested ".

              Quesako? o_O
              • Partager sur Facebook
              • Partager sur Twitter
                7 mars 2008 à 19:08:26

                donne le code qui pose problème
                • Partager sur Facebook
                • Partager sur Twitter
                  7 mars 2008 à 19:13:54

                  lecteur.cpp Contient les fonction primaires de lecture.
                  1. GUI *player = &fenetre;
                  2. void play(std::string fichier)
                  3. {
                  4. morceau = fichier.toAscii().data();;
                  5. FSOUND_STREAM *musique = NULL;
                  6. FSOUND_Init(44100, 32, 0);
                  7. musique = FSOUND_Stream_Open(morceau, 0, 0, 0);
                  8.     if (musique == NULL)
                  9.     {
                  10.         error("Impossible de lire le fichier \"" + morceau + "\"");
                  11.       exit(EXIT_FAILURE);
                  12.     }
                  13. FSOUND_Stream_Play(FSOUND_FREE, musique);
                  14. }
                  15. void error(std::string message)
                  16. {
                  17. QMessageBox::critical(player, "Erreur", message);
                  18. }


                  GUI.cpp Interface principale.
                  1. #include "GUI.h"
                  2. #include "prototype.h"
                  3. #include "C:\Dev-Cpp\mingw32\include\FMOD\fmod.h"
                  4. #include <QApplication>
                  5. #include <QMessageBox>
                  6. GUI::GUI() : QWidget()
                  7. {
                  8. setWindowTitle(tr("Digital Garage | v.test"));
                  9. setFixedSize(300, 150);
                  10. m_boutonparcourir = new QPushButton("Ouvrir un fichier", this);
                  11. m_boutonparcourir->setCursor(Qt::PointingHandCursor);
                  12. QObject::connect(m_boutonparcourir, SIGNAL(clicked()), this, SLOT(parcourir()));
                  13. }
                  14. void GUI::parcourir()
                  15. {
                  16. QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Musiques (*.mp3 *.wma *.ogg *.wav *.acc)");
                  17. if(fichier!="")
                  18. {
                  19. QMessageBox::information(this, "Fichier", "Vous avez sélectionné :\n" + fichier);
                  20. play(fichier);
                  21. }
                  22. else{QMessageBox::warning(this, "Fichier", "Vous n'avez sélectionné aucun fichier");}
                  23. }
                  .

                  La seule erreur qui m'est renvoyé est celle queje t'ai donné.
                  Pourquoi des fonctions au lieu des métohdes objet ? J'ai du mal avec la POO, je suis habitué au brut du PHP ^^ .
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 mars 2008 à 19:19:50

                    D'après moi, le problème vient d'ici :
                    1. QMessageBox::information(this, "Fichier", "Vous avez sélectionné :\n" + fichier);
                    2. play(fichier);


                    Essaie avec ça :
                    1. QMessageBox::information(this, "Fichier", QString("Vous avez sélectionné :\n") + fichier);
                    2. play(fichier);
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mars 2008 à 19:30:35

                      Ca ne marche pas, exactement la même erreur qu'avant :/
                      Ca ne m'étonne pas d'un côté car, getOpenFileName renvoi déjà un QString.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 mars 2008 à 19:47:32

                        tout à fait normal que ça marche pas, ta fonction "play" prends une std::string en paramètre et tu lui passes un QString :-°
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 mars 2008 à 19:49:22

                          c'est quoi la différence, un string est un string no ?

                          EDIT : j'ai modofié comme suis dans le fichier concerné:

                          1. void play(QString fichier)


                          Erreur retournée lors de la compilation :
                          error: conversion from `QString' to non-scalar type `std::string' requested
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 mars 2008 à 20:55:44

                            Citation : Feng Huang

                            c'est quoi la différence, un string est un string no ?


                            bien sûr, mais QString est à std::string ce que QPushButton est à std::vector :
                            totalement autre chose (enfin un autre objet incompatible)

                            Citation : Feng Huang

                            j'ai modofié comme suis dans le fichier concerné:


                            si tu as la même erreur c'est que tu n'as pas tout modifié, tu n'as probablement pas modifié play() dans le header (prototype.h si je ne me trompe pas)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 mars 2008 à 21:08:34

                              Autant pour moi, prototype.h n'était pas modifié, maintenant je retourne à mon erreur de convertion !! A partir de QString, je veux un const char* (cf. prototype de la fonction FSOUND_Stream_Open(const char*, unsigned int,int,int);
                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 mars 2008 à 21:16:34

                                Citation : ornithorynx

                                1. taFonction((const char*)ta_qstring.toLocale8Bit());
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 mars 2008 à 21:24:47

                                  error: 'class QString' has no member named 'toLocale8Bit'


                                  Un problème aussi primaire que ça.. ça commence à m'énerver, pis j'trouve rien sur google aussi ça saoule, à croire que personne n'a jamais rencontré ce problème !!!
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 mars 2008 à 21:56:29

                                    . . .
                                    google => QString 4.3 => Ctrl+F => toLocal => compris => fini => 5 secondes ...

                                    toLocal8Bit() et pas
                                    toLocale8Bit()


                                    c'est pas pour rien que tout le monde dit que la doc de Qt est génial , des que tu as des questions sur une classe :
                                    QTruc 4.3 sur google, et c'est la première page :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 mars 2008 à 22:07:00

                                      J'arrête de faire genre, je vérifie que ma réponse est bonne, elle l'est pas, j'ai l'air trop con,aurevoir et merci.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 mars 2008 à 22:31:51

                                        :)

                                        http://doc.trolltech.com/4.3/qstring.html

                                        Citation : Doc


                                        Public Functions :

                                        QByteArray toLocal8Bit () const



                                        ma vue me tromperais-t'elle ? (watcha les tirets et autres zapostrophes :S )
                                        y aurais-t'il un 'e' qui se cache entre le 'l' et le ventre gonflé du 8 de 8Bit ? hmm ... petit petit petit ... ah tient non ...

                                        et quand je lis l'erreur que donne ton compilo :

                                        'class QString' has no member named 'toLocale8Bit'

                                        Diantre ! un vilain 'e' en trop ...

                                        sur ce, je te fais des gros bisous mon roudoudou d'amour que j'aime et a qui je fais plein de calin parceque je l'aimeeeuh bieeeen :)

                                        en plus il est tellement agréable et gracieux avec les gens qui essaient de l'aider ... c'est vraiment un plaisir d'aider et de se faire jeter lamentablement :)

                                        (et oui, c'est exactement le cas où l'on s'excuse en écrivant un élégant petit 'oops' :) parceque ok ma réponse était un peu froide, et tendais vers le glacial, mais elle n'en étais pas moins juste... et il y avais un petit monsieur qui sourissais a la fin ... pour signifier que je ne suis pas sans coeur ... comme ça ... Souris :) )
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 mars 2008 à 22:38:36

                                          1. monQString.toStdString().c_str();
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                            7 mars 2008 à 22:41:39

                                            (en effet shadosan, mais c'est moins sexy :) )

                                            sinon, pourquoi préférer toLocal8Bit() à par exemples ... toAscii() ou toLatin1() ... ils retournent tous un QByteArray donc il doit y avoir des subtilitées au niveau de l'encodage non ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              7 mars 2008 à 22:47:31

                                              je vais essayer de faire clair CA MARCHE PAS!!
                                              CAPICHE?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                7 mars 2008 à 22:49:49

                                                ligne 42 de ton code :)

                                                ca marche pas ou ? c'est quoi l'erreur ?

                                                tu me dis que ton compilo te donne cette erreur :
                                                error: 'class QString' has no member named 'toLocale8Bit'

                                                je te répond qu'il y a pas de 'e' à Local ... ensuite si il y a d'autres erreurs, je suis pas voyant ... alors a moins qu'il n'y ai un subtil sens caché à "CA MARCHE PAS" ... je peux pas deviner quelle ligne de code est incriminé , et pourquoi elle l'est ...
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  7 mars 2008 à 22:54:37

                                                  Sinon prend le deuxième lien
                                                  http://www.google.fr/search?hl=fr&q=QString+to+char&meta=
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  :)
                                                    7 mars 2008 à 23:14:08

                                                    si un modo pouvait fermer ce topics'il vous plait, ça par en live et je vais devenir vulgaire
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 mars 2008 à 8:56:53

                                                      mais Explique-nous ton problème -_-' pas besoin d'être vulgaire ...
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        8 mars 2008 à 13:42:04

                                                        bon, la nuit m'a calmé, voilà le prototype de la fonction FSOUND_Stream_Open();

                                                        FSOUND_Stream_Open(const char *name_or_data, unsigned int mode, int offset, int length);

                                                        Vous voyez qu'elle doit recevoir en premier argument un const char.
                                                        Or la fonction utilisé pour ouvrir le fichier ( à savoir getOpenFileName() ) renvoi un QString.
                                                        La question est : comment convertir un QString en const char* ?

                                                        [Merci de votre patience]

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          8 mars 2008 à 13:46:31

                                                          Comme visiblement tu n'es pas allé voir mon lien.. (ce qui est bien domage) voici l'une des réponse possible http://www.developpez.net/forums/showthread.php?t=351289
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          :)
                                                            8 mars 2008 à 14:00:11

                                                            J'avais déjà lu ce lien avant deposter ici, cela dit je ne comprenais pas comment ça marchait, à force de lire des exemples j'ai compris ; ça marche!
                                                            Maintenant nouveau problème : nouveau sujet

                                                            EDIT: j'ai failli oublié : merci.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            convertir un QString en const char*

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown