- Resumen de los resultados de buscar y comparar bibliotecas para crear GUI en C++
- Requisitos básicos: solo se necesita soporte para Windows, uso comercial permitido, modo oscuro incluido con estilo fácil de personalizar, generación de un solo EXE de menos de 40 MB con dependencias mínimas, desarrollo rápido
WinUI 3
- Al principio parece una opción excelente
- Permite usar componentes modernos de Windows y personalizar los colores del estilo
- Se puede diseñar con XAML e incluso usar directamente el diseñador de Visual Studio
- Problemas:
- La distribución de la app en formato no empaquetado no está bien soportada
- Al mover la app a una VM u otra computadora, en la mayoría de los casos no logra ejecutarse
- Hay que distribuir muchos archivos
.dll para manejar las funciones de WinUI
- No se puede crear un solo archivo
.exe portable
- Como paquete no hay problema, pero se instala como paquete AppX y eso causa problemas de acceso a la API de Win32
Win32 / MFC / bibliotecas pequeñas que envuelven Win32
- Como se necesita alta portabilidad, tiene sentido usar el renderizado nativo del sistema operativo
- El programa puede ser un solo archivo
.exe y además puede ser muy pequeño (si se enlaza MFC de forma estática)
- Se puede usar alguna biblioteca más minimalista que alguien ya haya escrito
- Problemas:
- Dar estilo a los controles básicos de Win32 es muy difícil
- Hay que escribir funciones de pintado personalizado para todos los controles
- Existe un modo oscuro "oculto" usado en el Explorador de archivos de Windows, pero solo cubre algunos controles y aun así no se ve bien
Qt
- El santo grial de las GUI en C++
- Es complejo, pero se puede estilizar fácilmente usando Qt Style Sheets
- Problemas:
- Si se enlaza dinámicamente, hay una enorme cantidad de
.dll necesarias para ejecutar la app y el tamaño supera los 40 MB
- Se puede enlazar Qt de forma estática al programa, pero por la licencia LGPL de Qt hay que hacerlo open source o distribuir los archivos objeto para permitir la recompilación
- O se puede comprar una licencia comercial, pero cuesta miles de dólares
wxWidgets
- Biblioteca fácil de aprender
- Se puede usar wxFormBuilder
- Tiene una licencia más permisiva que Qt y se puede enlazar estáticamente en un ejecutable de 3 MB
- Problemas:
- En Windows usa componentes nativos de Win32 y no ofrece opciones de estilizado
- Soporta aplicar los controles oscuros del Explorador de archivos de Windows, pero el resultado no es muy bueno
hikogui
- Nueva biblioteca GUI de modo retenido que usa Vulkan como backend
- Tiene modo oscuro integrado y es fácil de estilizar
- Problemas:
- Hace falta un doctorado en ciencias de la computación para compilarla con éxito
- Después de intentar compilar los ejemplos durante más de 30 minutos, solo se obtuvo un ejecutable que se cerraba de inmediato con una violación de acceso dentro de la biblioteca de Vulkan
Sciter
- Buena alternativa a Electron que permite crear GUI para apps de escritorio usando HTML/CSS
- Problemas:
- El tamaño final de la app, de unos 25 MB junto con todas las
.dll, parece que podría ser un problema, aunque es aceptable
- Sería mejor si fuera open source y pudiera usarse una versión de enlace estático para uso comercial
- Como no es tan caro como Qt ($310), gustosamente pagaría
- El problema es que el renderizado no es muy bueno
- Hubo problemas de aliasing en fuentes e imágenes
- La ventana tiene un marco gris bastante grueso (2-3px) que no se puede personalizar ni modificar
WinForms / WPF
- Cuando uno pregunta por bibliotecas GUI para C++, la mayoría recomienda usar otro stack
- Dicen que C++ es una mala idea, así que el frontend del programa debería escribirse en otro stack y cargar como componentes/módulos las funciones escritas en C++
- Se puede tener un solo
.exe pequeño y usar WinForms/WPF
- Se pueden empaquetar las
.dll como recursos dentro de la app, extraerlas a una carpeta temporal y luego usar P/Invoke para llamar a las .dll compiladas desde la app en C#/.NET, o usar C++/CLI
- Problemas:
- El framework de .NET viene preinstalado en Windows 10 o superior, así que técnicamente cumple con el criterio de no tener dependencias
-
- Si se empaquetan las
.dll, hay que extraerlas en algún lugar y escribir código adicional para que P/Invoke funcione
-
- C++/CLI se compila a código IL de .NET, por lo que termina viéndose como código C++ traducido a C#
¿Solución?
- Para apps simples, no parece haber nada más adecuado que Dear ImGui
- Al diseñar interfaces complejas tiene sobre todo desventajas, y como no es una UI de modo retenido sino de modo inmediato, hay que ejecutar un renderizador GPU como DirectX para dibujar la UI a más de 60 cuadros por segundo
- Pero en todo lo demás sí encaja
- El programa compilado pesa apenas 500 KB y no hace falta instalar los redistribuibles de VC++
Opinión de GN⁺
- Como dice el autor, parece que no existe una biblioteca perfecta para desarrollar apps GUI. Todo depende de los trade-offs según los requisitos
- Para apps simples, Dear ImGui parece la opción más adecuada, pero para crear interfaces complejas podría ser mejor usar un toolkit GUI de modo retenido
- Si se quiere crear una app comercial, el costo de la licencia puede ser una consideración importante. Bibliotecas como Qt son costosas, mientras que wxWidgets puede usarse gratis
- Crear apps GUI en C++ no es algo sencillo, así que podría ser más realista desarrollar el frontend en C# u otro lenguaje e implementar en C++ solo las partes intensivas en rendimiento
- Si se quiere un look-and-feel nativo de Windows, conviene usar WinUI o MFC, pero si se necesita soporte multiplataforma, Qt o wxWidgets podrían ser mejores opciones
7 comentarios
hikogui da un poco de miedo, jajaja
https://getstream.io/blog/flutter-desktop-vs-electron/ Comparación del rendimiento con varias métricas
En comparación con Sciter y Electron, también vale la pena considerar Flutter Windows Desktop Build. A veces hay plugins con algunos bugs, pero la base es sólida, así que se puede usar como medio de entrega. Instancia singleton, actualizaciones automáticas, bandeja del sistema, notificaciones de Windows, tiempo de arranque rápido, lenguaje Dart, plugin de Win32 API, etc.
Delphi
C++ Builder
"Se necesita un doctorado en ciencias de la computación para que compile con éxito"
jajaja
Opinión de Hacker News
wndproc. La mayoría de los controles le preguntan al padre por los colores