|
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! " ;
QString copie = texte;
QString secondeCopie;
secondeCopie = copie;
uneFonction (texte);
|
|
lien : Comment Qt optimise t il les copies ?
|
|
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 ();
}
foreach (const char * str, ipListEnChar)
{
printf (str);
}
|
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 : Transformer un QString en std::string et réciproquement ?
|
|
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 " ;
QString s1 = s. arg (42 );
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 " ;
QString s1 = s. arg (" formatage recurssif : %1 %2 " );
|
|
|
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 );
|
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 : Formatage de texte avec QString ?
lien : Comment formater les nombres entiers ?
|
|
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 ();
|
Utilisation avec le paramètre qui permet la vérification de la conversion:
QString -> int | QString str1= " 128 " ;
QString str2= " Qt128 " ;
bool ok;
int num1 = str1. toInt (& ok);
int num2 = str2. toInt (& ok);
|
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;
int num = str . toInt (& ok, 16 );
str = = " 0xFFFF " ;
num = str. toInt (& ok, 16 );
|
Remarque : Le même principe de conversion existe pour les autres types de variables numériques:
- toLong()
- toShort()
- toUInt()
- toUShort()
- toULongLong()
|
|
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'
QString: : number (299792458 . 0 , ' e ' );
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.
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 : Formatage de texte avec QString ?
lien : Conversion QString vers nombre ?
|
|
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:
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.
|
|
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 (" ∞ " );
|
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


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.