IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Le contenu de Qt4 > QtCore > QString
        Faut-il utiliser les pointeurs avec QString ?
        Transformer un QString en std::string et réciproquement ?
        Comment convertir un QString en chaîne C (char *) ?
        Formatage de texte avec QString ?
        Comment convertir un nombre en chaîne de caractère ?
        Comment formater les nombres entiers ?
        Conversion QString vers nombre ?
        Comment formater les nombres réels ?
        Comment tester si une chaîne de caractère est vide ?
        Comment QString gère l'encodage des chaînes de caractères ?



Faut-il utiliser les pointeurs avec QString ?
auteur : Benjamin Poulain
Ce n'est pas nécessaire. QString utilise un pointeur partagé pour stocker les caractères. Les opérations de copie et d'affectation sont aussi performante qu'en manipulant des pointeurs.
QString texte = "Developpez!";
// la copie est rapide
QString copie = texte;  
QString secondeCopie;
// l'affectation est rapide
secondeCopie = copie;  
// utiliser QString en argument est efficace
uneFonction(texte); 
lien : faq Comment Qt optimise t il les copies ?

Transformer un QString en std::string et réciproquement ?
auteur : Matthieu Brucher
Pour transformer un std::string en QString, utilisez la fonction statique QString::fromStdString().

Pour l'opération inverse, transformer un QString en std::string, utilisez la fonction membre toStdString().

lien : en La classe String

Comment convertir un QString en chaîne C (char *) ?
auteur : Yan Verdavaine
Pour convertir un object QString en chaîne de 8 bits, il faut utiliser les méthodes toAscii(), toLatin1(), toUtf8(), toLocal8Bit(). Ces méthodes retournent un objet QByteArray, qui permet de gérer la mémoire. QByteArray fournit les méthodes constData() et data() pour accéder à un pointeur sur un tableau de char. Ce pointeur est valide aussi longtemps que l'objet n'est pas modifié ou détruit.
QString adresseIp("127.0.0.1");
QByteArray adresseIpEncodee = adresseIp.toUtf8();
printf(adresseIpEncodee.constData());
Avec des chaînes de type C, il faut être attentif à la mémoire. Par exemple, le code suivant provoquera des problèmes de mémoire:
QStringList list;
list << "C" << "C++" << "Qt";
QList<const char*> ipListEnChar;
foreach(QString ip, list)
{
    QByteArray adresseIpEncodee = ip.toUtf8();
    ipListEnChar << adresseIpEncodee.constData(); // le pointeur sera invalide
}
foreach(const char *str, ipListEnChar)
{
    printf(str); // le résultat est imprévisible
}
Il faut revenir aux vielles habitudes de C et gérer les allocations à la main. Il suffit dans l'exemple de s'assurer que les objets QByteArray ne soient pas détruits:
QStringList list;
list << "C" << "C++" << "Qt";
QList<QByteArray> ipListEnCharData;
QList<const char*> ipListEnChar;
foreach(QString ip, list)
{
      QByteArray adresseIpEncodee = ip.toUtf8();
      ipListEnChar << adresseIpEncodee.constData();
      ipListEnCharData << adresseIpEncodee;
}
foreach(const char *str, ipListEnChar)
{
    printf(str);
}
Dans un problème réel, le tableau de char* serait caché dans les fonctions C utilisées, et il faut être rester attentif à la gestion de la mémoire.

Remarque : QString permet aussi une conversion vers les formats std::string et std::wstring fournis par la STL.

lien : faq Transformer un QString en std::string et réciproquement ?

Formatage de texte avec QString ?
auteur : Yan Verdavaine
QString implémente un équivalent au printf et boost::format pour faire du formatage de string. Pour cela, QSting utilise des formateur sous la forme %n (ou n est un nombre) et les fonctions arg.

Chaque fonction arg retourne une nouvelle string où les %n sont remplacés par ordre croissant. La fonction arg possède énormément de versions différentes qui vont permettre de remplacer un formateur par un nombre ou une string. De plus si plusieurs formateurs ont le même nombre, ils seront remplacés par la même valeur.
QString  s = "%2 et %1 ou %1 et %3";
//on remplace le plus petit formateur contenue dans s
//tout les %1 sont remplacé par le nombre 42
//    s1 == "%3 et 42 ou 42 et %2"
//    s n'est pas modifié
QString  s1 = s.arg(42);
 
//on remplace plusieurs formateurs contenue dans s1 dans l'ordre croissant
//   %2 est remplacé par hello
//   %3 est remplacé par salut
//   s2 == "salut et 42 ou 42 et hello"
//   s1 n'est pas modifié
QString s2 = s1.arg("hello","salut");
Cet outil est d'autant plus puissant que l'on peut faire du formatage récursif : l'on peut ajouter des formateurs lors du remplacement d'un formateur.

QString  s = "%1";
//%1 est remplacé par "formatage récursif : %1 %2"
//   s1 == "formatage récursif : %1 %2"
//   s1 est composé par deux nouveau formateurs.
QString  s1 = s.arg("formatage recurssif : %1  %2");

Comment convertir un nombre en chaîne de caractère ?
auteur : Benjamin Poulain
QString fournit la méthode statique number() pour convertir des nombres:
QString cinquante = QString::number(50);
QString unTier = QString::number(0.33333);
Avec QString::number(), il est aussi possible de spécifier la base pour les entiers, et le format et la précisions pour les réels. La méthode statique QString::number() possède un équivalent pour convertir un nombre dans un objet existant: QString::setNum(), par exemple:

QString cinquante("Ce texte sera supprimé");
cinquante.setNum(50); // cinquante vaut "50"
Pour insérer un nombre dans une chaîne de caractère, il est plus simple d'utiliser les fonctionnalités de formatage de QString

lien : faq Formatage de texte avec QString ?
lien : faq Comment formater les nombres entiers ?

Comment formater les nombres entiers ?
auteur : François Jaffré
Qt à l'aide de la classe QString peut formater des chaines de caractères. Cela est possible grâce à la méthode sprintf() qui permet de formater les chaines comme en C ou à la méthode agr() qui est plus propre à Qt.

Exemple : On souhaite formater une chaine de la forme Image_00032
avec sprintf()
QString str;
int val=32;
str = str.sprintf("Image_%05d" , val ); // str == "Image_00032"
avec arg()
QString str = "Image_%1";
int val=32;
str = str.arg(val, 5 , 10 , QChar('0') ); // str == "Image_00032"
lien : en QString::sprintf
lien : en QString::arg

Conversion QString vers nombre ?
auteur : François Jaffré
La classe QString implémente directement des méthodes pour transformer une chaine de caractère en variable numérique. De plus ces méthodes possèdent des paramètres optionnels :

  • Comme il est possible que la conversion soit impossible, un pointeur vers un bool permet de récupérer si la conversion à eu lieu ou non
  • Pour la conversion vers un des types entiers, il est possible de spécifier la base (2 à 36) .
Utilisation sans paramètre:
QString -> double
QString str="123.36969577";
double number = str.toDouble();//number == 123.36969577
Utilisation avec le paramètre qui permet la vérification de la conversion:
QString -> int
QString str1="128";
QString str2="Qt128";
bool ok; //Permet de verifier si la conversion a reussi ou non.
int num1 = str1.toInt(&ok); //ok == true et conversion reussi num1 ==128 
int num2 = str2.toInt(&ok); //ok == false et conversion échouée num2 == 0
Conversion d'une chaine dans une base particulière (Ex:Hexa, Octal...):
Conversion d'une chaine dans une base hexa
QString str = "FFFF";
bool ok;//Toujours utile à la verification de la conversion 
int num = str .toInt(&ok,16); //ok == true et num == 65535
str == "0xFFFF"; //Les conventions standards du C par exemple ici "0x" pour une chaine hexa sont reconnues.
num = str.toInt(&ok,16); //ok == true et num == 65535
Remarque : Le même principe de conversion existe pour les autres types de variables numériques:

  • toLong()
  • toShort()
  • toUInt()
  • toUShort()
  • toULongLong()

Comment formater les nombres réels ?
auteur : Benjamin Poulain
La méthode statique QString::number() , prend des arguments facultatifs qui permettent de formater les nombres réels.

Le premier argument est un caractère qui précise le format, les formats possibles sont:

  • 'e': format scientifique avec un e minuscule; exemple: 2.997925e+08
  • 'E': format scientifique avec un e majuscule; exemple: 2.997925E+08
  • 'f': format classique pour les réels "299792458.0"
  • 'g': choisir automatiquement le plus concis entre 'e' et 'f', c'est le mode par défaut
  • 'G': choisir automatiquement le plus concis entre 'E' et 'f'
// vaut "2.997925e+08"
QString::number(299792458.0, 'e'); 
// vaut "299792458.000000", voir plus loin pour comprendre pourquoi
QString::number(299792458.0, 'f'); 
Le second argument permet de spécifier la précision utilisée. Par défaut, Qt utilise une précision de 6, ce qui explique le résultat de l'exemple précédent.
// vaut "299792458.0"
QString::number(299792458.0, 'f', 1); 
Il est suggéré de toujours préciser le format lorsque l'on veut convertir des réels (que ce soit avec Qt ou autre). Dans le cas contraire, un affichage inattendu peut apparaître lorsque les nombres deviennent très petits ou très grand, ce qui n'apparaît généralement pas dans les tests lors du développement.

Pour insérer un réel dans une chaîne de caractère, il est plus simple la fonctionnalité de formatage de QString

lien : faq Formatage de texte avec QString ?
lien : faq Conversion QString vers nombre ?

Comment tester si une chaîne de caractère est vide ?
auteur : Benjamin Poulain
QString fournit la méthode isEmpty() pour savoir si une chaîne est vide:
if(texte.isEmpty()){
  ...
}
Il est possible de comparer QString avec un tableau de char, ce qui permet aussi de tester si une chaîne est vide:

// mauvaise idée
if(texte == ""){ 
  ...
}
Cela fonctionne, mais il y a une conversion implicite de "" en QLatin1String, ce qui est inutile pour une chaîne vide et est légèrement moins performant que l'exemple précédent.


Comment QString gère l'encodage des chaînes de caractères ?
auteur : Benjamin Poulain
En interne, QString stocke les caractères en Unicode 4.0 sur 16 bits, ce qui permet des opérations rapides quelque soit le type de caractère utilisé.

Pour convertir un chaînes sur 8bits en QString, il est possible de l'encoder grâce aux méthodes statiques fromAscii(), fromLatin1(), fromUtf8(), et fromLocal8Bit(). Par exemple:
QString infini = QString::fromUtf8("&#8734;");
Par défaut, QString interprète une chaîne C avec l'encodage Latin 1 (ISO 8859-1). Il est possible de changer ce comportement de façon globale grâce à la méthode statique QTextCodec::setCodecForCStrings().

Pour convertir un objet QString en tableau de char, il faut utiliser une des méthodes toAscii(), toLatin1(), toUtf8() ou toLocal8Bit(). Si d'autres encodages sont nécessaires, il suffit d'utiliser QTextCodec qui permet d'encoder à peut prêt n'importe quoi.



Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.