2011-05-26 22 views
9

Utilizo Qt extensamente en un sistema de software en el que estoy trabajando para componentes gráficos y GUI. Sin embargo, para la mayoría de los algoritmos internos y el procesamiento de datos, Qt juega un papel más pequeño.Uso de std :: string y QString indistintamente

A menudo me encontraré con la necesidad de convertir de std :: string a QString o viceversa. Mi inclinación es usar std :: string tanto como sea posible y usar QString solo cuando necesito pasar cadenas a clases Qt como aquellas que funcionan con el sistema de archivos.

Como estaba programando esta mañana, me di cuenta de que puede ser un mal diseño tener std :: string y QString salpicado a lo largo de mi código. ¿Debo cambiar completamente a QString? ¿Alguien más se ha topado con esta opción de diseño?

Qt proporciona una gran parte de la misma funcionalidad de STL, pero sigo dudando de cambiar por completo ya que Qt es menos estandarizado y estable.

Respuesta

9

Sí, he tenido esta situación antes. El programa en el que trabajé usó Qt en todo momento, pero tuve que conectarlo a una biblioteca que esperaba std::string. El beneficio de QString es que explícitamente utiliza Unicode, mientras que la biblioteca estándar de C++ no garantiza la codificación.

La solución fue convertir en el límite de esta biblioteca con

QString toQString(std::string const &s) 
{ 
    return QString::fromUtf8(s.c_str()); 
} 

std::string fromQString(QString const &s) 
{ 
    return std::string(s.toUtf8().data()); 
} 

desde la biblioteca producida std::string 's que contienen UTF-8.

Lo que parece querer es exactamente lo contrario: use std::string en todo y conviértalo en el límite de Qt. Eso parece perfectamente bien; requiere un poco más de trabajo que siempre usando QString, pero deberá esforzarse cuando necesite una biblioteca que no sea QString, y los componentes que no sean de la GUI no dependerán de Qt (¡hurra!).

+1

'QString' tiene un método' toStdString() '. Vea aquí: http://doc.trolltech.com/4.5/qstring.html#toStdString. Para crear un 'QString' de' std :: string' puedes usar este constructor: http://doc.trolltech.com/4.5/qstring.html#QString-7 – yasouser

+1

@yasourer: sí, pero eso depende de un global establecer la codificación de caracteres. Estas funciones provienen de una biblioteca que obtuvo 'std :: string' de otra biblioteca, que siempre contiene UTF-8. –

+0

Puede mejorar esas funciones para que funcionen incluso si las cadenas contienen NUL incorporados, al pasar también la longitud - 'return QString :: fromUtf8 (s.c_str(), s.size())' y 'auto buf = s. toUtf8(); return std :: string (buf.data(), buf.size()); '. –

6

Yo diría que use std::string en el núcleo de su programa, y ​​conviértalos a QString cuando esté trabajando en la parte de la GUI. Si alguna vez quiere cambiar su kit de herramientas GUI, será más fácil.

Cuestiones relacionadas