8 puntos por GN⁺ 2024-07-01 | 7 comentarios | Compartir por WhatsApp
  • 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

 
tsboard 2024-07-05

hikogui da un poco de miedo, jajaja

 
fastkoder 2024-07-03

https://getstream.io/blog/flutter-desktop-vs-electron/ Comparación del rendimiento con varias métricas

 
fastkoder 2024-07-03

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.

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"Se necesita un doctorado en ciencias de la computación para que compile con éxito"
jajaja

 
GN⁺ 2024-07-01
Opinión de Hacker News
  • Al leer muchos comentarios, me di cuenta de que toda la premisa estaba mal. Sería mejor renombrar la entrada del blog a "Es doloroso escribir una app GUI para Windows cuando los requisitos son irreales"
  • Sería buena idea apuntar a WinForms usando .NET Framework 3.5. Ya viene instalado en todas las versiones modernas de Windows
  • Este artículo da una buena visión general de varias opciones, pero los requisitos específicos del autor terminan descartando muchas de ellas
    • El requisito de querer un estilo de GUI totalmente personalizado sin querer escribir sus propias funciones de renderizado convierte esto en una búsqueda de una librería de GUI fácil de personalizar
    • El requisito de un ejecutable autocontenido y un límite de tamaño menor a 40 MB también descarta muchas opciones. Qt podría haber cumplido estos requisitos, pero su licencia de código abierto no encajaba con el objetivo y no quería comprar una licencia
    • Si se permiten dependencias, o se acepta un tamaño de descarga mayor, o se usan los controles GUI integrados de Windows, la situación cambia mucho
    • Si lo que se quiere es una GUI totalmente personalizada, ligera, sin dependencias externas y con una licencia permisiva, esperaba que ImGui fuera la respuesta
  • Señala que no hay una gran falla en la idea de WinForms/WPF, pero fuera de requerir dos stacks, no menciona nada más. Quiere código nativo y no quiere ver C#, pero no explica por qué. Tal vez sea por miedo a la ingeniería inversa. El código de UI rara vez contiene secretos
    • Distribuir en un solo exe a veces es conveniente, pero en este escenario puede ser una molestia. Si usas un empaquetador como Velopack (Squirrel), puedes distribuir como un solo exe y además agregar actualizaciones automáticas. Tener dos o más archivos en disco al instalar es un buen compromiso
    • Windows es la peor plataforma para desarrollar apps de escritorio, excluyendo todas las demás plataformas
  • Tengo una opinión muy mala de los desarrolladores que se quejan de tener que pagar una licencia comercial por librerías de software con licencia LGPL. Ellos esperan recibir compensación por su trabajo y lo garantizan creando software de código cerrado. Pero el desarrollador que resolvió la parte realmente difícil de crear una librería de UI debería ser un adulto que regale libremente su código al mundo
  • Sobre Sciter y el problema de "antialiasing"... el autor no habilitó el soporte de DPI de alta resolución en la aplicación
    • Se puede resolver activándolo en Visual Studio o incluyendo el manifiesto adecuado
    • Se explica en el tutorial "Hello C++"
  • Para ser más precisos:
    • "Portable" (un solo exe sin autoextracción)
    • Quiere que sea comercial y no redistribuir archivos de objetos compilados (esto, junto con el requisito de "portable", no permite LGPL)
    • Modo oscuro
    • Las apps GUI de Windows son dolorosas. Si quitas uno de estos requisitos, hay muchas buenas opciones
    • La mayoría de las aplicaciones "portable" usan win32. Normalmente, portable implica aplicaciones pequeñas y simples donde la funcionalidad importa más que el modo oscuro u otras capacidades de estilo
  • Como alguien que le exige mucho al código abierto de otros, el autor no parece dispuesto a publicar su propia solución como código abierto
  • Estoy trabajando en un toolkit GUI que cumple con los requisitos: Slint - https://slint.dev
    • Puede compilarse estáticamente en un solo .exe y pesar menos de 40M. Tiene una licencia que permite uso gratuito en escritorio. Ofrece estilos oscuro/claro. También incluye un editor WYSIWYG de arrastrar y soltar (en desarrollo)
  • Tener que escribir funciones de pintado personalizadas para todos los controles muestra que la filosofía antigua de win32 no le acomoda al autor. El elemento central de win32 es wndproc. La mayoría de los controles le preguntan al padre por los colores
    • Si eso resulta incómodo, envolverlo con una librería pequeña para quitar el boilerplate no es un gran problema
  • El resultado tiene que ser un único archivo .exe sin dependencias o con dependencias mínimas, y debe pesar menos de 40 MB
    • Las computadoras ahora ya tienen un navegador moderno. En vez de un archivo .exe, se podría usar un solo archivo .html con imágenes/css/javascript en línea