2011-11-06 13 views
7

Más una pregunta personalizada y práctica, pero se considera de mala calidad, o altamente desaconsejable (elija su interpretación de maldad) para mezclar el uso de tipos de biblioteca Qt y tipos de C++ estándar similares en el programa?Qt - mezclando Qt y std :: C++ tipos

Por ejemplo, ¿es muy recomendable utilizar SOLAMENTE QStrings para el uso de cadenas, o la gente suele mezclar los tipos QString y std :: string en el archivo fuente?

He heredado un código que incluye el uso de QString y std :: string en el archivo y me pregunto si convierto todo en uno u otro.

Respuesta

7

Creo que realmente todo se reduce a "depende de lo que esté haciendo". Ciertamente, es más fácil mantener las cosas como un único tipo. Sin embargo, puede haber momentos en los que necesite pasar std :: strings o pasar QStrings y podría ser mejor para el rendimiento no hacer la conversión.

También tenga en cuenta que QStrings no son lo mismo que std: strings. Así que tenlo en cuenta al convertir entre ellos (o elegir usar solo cierto tipo).

3

En general yo prefiero usar QString sobre std::string y contenedores de Qt (como QList, ...) más de std contenedores en el código que está estrechamente unida al marco de Qt, de todos modos y no tendría sentido sin ella. En todos los demás componentes (como las bibliotecas auxiliares y similares), prefiero usar la forma estándar de C++, por razones de flexibilidad.

Pero creo que esto es más una decisión subjetiva, ya que los tipos son generalmente bastante fáciles de convertir el uno del otro (y los contenedores Qt también proporcionan iteradores estándar). Aunque en el código altamente Qt céntrico, los contenedores Qt podrían funcionar mejor, especialmente junto con el metaobjeto y el sistema de tipos de Qt.

1

Supongo que es decisión suya. Considere de todos modos que la conversión entre los dos requiere una copia de la cadena, por lo que si ambos requieren conversiones, entonces no es bueno en términos de rendimiento: lea por ejemplo QString::fromStdString y QString::fromStdWString. Si está utilizando Qt, creo que podría estar utilizando no solo QString, y en este caso la mayoría de los métodos de las clases de Qt requieren que proporcione QString. Por lo tanto, podría ser malo para el rendimiento e incómodo de escribir.

Tenga en cuenta también que std :: string varía ligeramente de la implementación a la implementación, y std :: string copy-on-write puede mostrar un rendimiento diferente.

+0

Sus enlaces están rotos. –

3

QStrings y cadenas de C++ resuelven diferentes problemas: la principal diferencia es que QStrings se ocupa de locales/codificaciones explícitamente, mientras que std :: strings no lo hace.

así que use QStrings para todos los datos escritos por los usuarios y todas las cadenas que se mostrarán a sus usuarios, o corre el riesgo de perder información codificando conversiones y/o dificultando la internacionalización de su aplicación en el futuro.

Para cualquier cosa en la que solo necesite un equivalente de char *, p. manteniendo los datos leídos de una base de datos donde las configuraciones regionales/codificaciones no son aplicables, utilizo std :: cadenas ya que son mucho más fáciles de usar con bibliotecas que no son Qt y sus datos no se someten a ninguna conversión de codificación. Sin embargo, debe agregarlos explícitamente al sistema de tipo qt para poder usarlos en argumentos de señal/ranura, lo que es fácil una vez que sepa cómo.

Pero al final es una decisión: solo para hacer que la base de código sea más accesible para los recién llegados, puede ser mejor usar QString en todas partes, o posiblemente solo std :: string en todas partes si usa QtCore de una forma no -gui aplicación.

5

Marque esta blog post que compara STL a QTL y std::string a QString.

Mis 2 centavos

Realmente depende de lo que está haciendo. En general, cuando estoy codificando algo donde Qt no es necesario (por ejemplo, una biblioteca) siempre uso el STL. Por otro lado, si estoy escribiendo código para una aplicación GUI, prefiero usar QTL y QString sobre STL y std::string. Si deseo integrar este código con una biblioteca que está escrita usando STL proporciono funciones sobrecargadas que hacen la conversión de STL a QTL y QString a std::string.

QStrings son una necesidad Si desea localizar su aplicación ya que el uso de tr() y QLinguist hace que sea muy fácil.