QT-C ++ vs C ++ genérico y STL [cerrado]

19

He estado repasando mi C ++ últimamente, en Ubuntu QQ. Me encanta el marco Qt para todo, especialmente la creación de GUI. Me familiaricé bastante con él cuando usé PyQt en los últimos años.

Al usar PyQt, tuve algunos problemas que ahora son más pronunciados al usar C ++ con Qt: Qt tiene muchas extensiones para C ++ que son específicas de Qt : QString es solo un ejemplo común, sin mencionar la recolección de basura automatizada. Es posible escribir aplicaciones Qt usando C ++ sin saber mucho acerca de C ++ y STL.

Es posible que tenga que volver al mercado laboral pronto y me gustaría poder considerar las posiciones de C ++, pero me temo que vincularme demasiado a Qt limitará mis habilidades para trabajar con C ++ genérico, que alguna vez fueron bastante formidables, pero ahora están dormidos y oxidados.

¿Debo evitar Qt? ¿Sería mejor usar WxWidgets o GTK ++ para crear GUI?

¿Cuál es el mejor marco de GUI para usar que permite / requiere el mayor uso de C ++ genérico y STL? ¿Cómo me hago más comercializable como programador de C ++ cuando se trata de marcos de GUI, etc.?

Vector
fuente

Respuestas:

15

No me abstendría de usar Qt solo por esas razones. No es necesario que use todas las clases de utilidad de Qt; para los que reemplazan el STL, a lo sumo se verá obligado a usar QString y, posiblemente, QStringList. Además, generalmente hay mucho más en un programa que la GUI. Siempre puede usar C ++ exclusivamente genérico para el resto de su programa, y ​​usar Qt solo para la GUI.

En mi opinión, trabajar con STL se trata más de comprender qué estructuras de datos subyacentes se usan y sus complejidades, y, en consecuencia, en qué momentos debe usar cada contenedor. Y cuando se trata de programación en C ++, se trata especialmente de saber cómo usar el encabezado <algoritmo> muy esencial, que también debería funcionar en los contenedores de Qt, ya que son compatibles con STL.

No veo mucho daño en el uso de todas esas extensiones que Qt proporciona, siempre que sepa (o al menos tenga una idea general) de cómo se implementan internamente. Asegúrese de saber que cosas como Q_OBJECT, SIGNAL (), SLOT (), foreach (), no son mágicas, sino macros que se expanden a declaraciones válidas de C ++. Por ejemplo, no es tan complicado entender cómo se implementan las clases implícitamente compartidas y las relaciones padre-hijo que hacen que Qt se sienta más parecido a Java. Siempre puede intentar recrear alguna funcionalidad en un proyecto separado solo para ver si puede hacerlo con C ++ genérico, y luego no sentirse mal por usarlos en Qt.

Además, eche un vistazo a las bibliotecas de Boost. Proporcionan utilidades adicionales que la biblioteca estándar de C ++ no ofrece, y son una muy buena forma de acercarse un poco más a C ++ genérico, ya que esencialmente siguen las mismas convenciones que C ++ genérico. Algunas de las bibliotecas tienen clases con plantillas bastante complejas, y simplemente tratar de entender cómo funcionan es, en sí mismo, un buen estudio en C ++. Boost tiene muchas utilidades que no se pueden encontrar en Qt, y otras que implementan los mismos conceptos o similares que algunas de las clases de Qt y pueden usarse en su lugar.

Si llega al mercado laboral trabajando con C ++, es probable que trabaje con Qt u otro marco que, de manera similar, tenga sus propias clases de utilidad que intenten simplificar C ++.

LLLL
fuente
44
+1 para "Siempre puede usar C ++ exclusivamente genérico para el resto de su programa y usar Qt solo para la GUI".
Md Mahbubur Rahman
@MahbuburRAaman - sí, este es un excelente consejo. Use Qt solo para GUI y lo que es necesario enganchar en la parte posterior. Escriba el resto usando C ++ genérico, STL, Boost, las herramientas que se usan universalmente.
Vector
5

Estoy de acuerdo con la mayoría de los elogios de Qt, pero la pregunta era ¿Cuál es el mejor marco de GUI para usar que permite / requiere el mayor uso de C ++ genérico y STL? A este respecto, Qt es un poco esquizofrénico: duplica los contenedores y algoritmos STL con sus propios giros. También proporciona contenedores, que son diferentes a STL. La interoperabilidad entre Qt y STL no siempre es fácil. En algunos casos se necesita un par de llamadas de función para obtener de std::stringa QStringida y vuelta.

wxWidgets tiene una opción para la compilación STL, que utiliza exclusivamente contenedores STL: no hay un universo paralelo con reemplazos locales como en el caso de Qt. También se compila con un compilador estándar de C ++ sin necesidad de extensiones no estándar. Es un marco GUI de calidad que vale la pena considerar.

También puede echar un vistazo a gtkmm, que es un contenedor de C ++ alrededor de GTK +. Está más cerca de cumplir su primer requisito que Qt.

Paul Jurczak
fuente
1
'wxWidgets tiene una opción para construir STL, que usa contenedores STL exclusivamente ...' - Ya veo - esto es IMPORTANTE saberlo. 'En algunos casos, se requieren algunas llamadas de función para pasar de std :: string a QString' - entendido - aún no lo he investigado. Estoy un poco familiarizado con GTK y Wx, pero Qt parece brillar en comparación, al menos desde mi punto de vista (C ++ NO es mi primer idioma), vine del mundo Clipper / Delphi y luego aprendí C ++ porque tuve que lidiar con Win 32s etc.
Vector
2

No me preocuparía demasiado por no usar bibliotecas STL específicas como std :: string o std :: iostream o std :: vector. Los equivalentes QT tienen un sabor diferente, pero no están tan lejos como para causar problemas.

La diferencia más idiomática en mi opinión parece ser el estilo de programación pesado en el uso newpara la asignación. Mientras que para un programa QT esto podría estar bien para la parte de Gui, la virtud de C ++ y RAII es que puedes mantener muchos datos en la pila en lugar del montón. Al cambiar a escribir código no GUI, debe recordar eso.

wirrbel
fuente
1
El punto que estaba tratando de hacer no es que la asignación del montón sea generalmente mala, simplemente no es lo mejor para las variables locales. Las clases de GUI tienden a vivir mucho tiempo y se asignan mejor en el montón, las variables locales que solo se necesitan temporalmente viven bien en la pila. en C # con Garbace Collection pronto serán destruidos, por lo que el montón también está bien. Pero con las new/deletellamadas manuales esto no es tan fácil y propenso a errores. En las secciones críticas (manejo de big data) esto puede marcar la diferencia, especialmente las deletellamadas pueden ser bastante lentas.
wirrbel
1
Este no es un problema de 10000 objetos de interfaz de usuario, sino para estructuras de datos de árbol complejas con un millón de entradas, etc., donde una vez podría recurrir a formas más inteligentes de asignar cosas (asignación masiva o muchas clases de impulso escritas de forma inteligente, etc.). Conclusión: el montón no es malo, tiene que ser usado de manera inteligente. La forma Qt a veces no escala para otras cosas. Todavía es un kit de herramientas fabuloso en mi opinión.
wirrbel
Entonces, ¿qué tal C ++ 11? Los punteros inteligentes, etc., parecen aliviar muchas de sus preocupaciones. Estoy empezando a meterme con eso ahora. Como dije, estoy de acuerdo en que Qt KICKS BUTT. Mi plan es usar Qt para GUI y hacer todo lo que pueda usando C ++ 11, lo que parece generar una gran cantidad de Boost, por ejemplo, obsoleto y cierra en gran medida las brechas entre Java / C # y C ++ de la vieja escuela. Tengo la sensación (en este punto desde la distancia, sin duda) de que una combinación de Qt y C ++ 11 puede ser un gran ganador.
Vector
2
Creo que entendí mi punto: tiene muchas opciones con C ++, con c ++ debe elegir sabiamente. Los punteros inteligentes, etc. también tienen problemas. Harto de C #, puede echar un vistazo a dlang.org que hace muchas cosas mejor (GCed).
wirrbel
Mientras tanto, tengo que armar una cadena de herramientas que admita C ++ 11. Utilizo codelite en este momento, un IDE muy bueno, pero listo para usar (compilador GNU) no admite 11, como acabo de descubrir ... Tal vez puede enchufar un compilador compatible con 11. No voy a comenzar con D o Boo, etc., etc., como dije en cuestión, es posible que tenga que volver al mercado laboral muy pronto y quiero tener los idiomas principales para la comercialización, no los únicos. MUCHOS trabajos de Python por ahí, ¡lástima que no pueda soportar más a Python!
Vector